C# 如果在运行时只知道类型参数,如何调用泛型方法?

C# 如果在运行时只知道类型参数,如何调用泛型方法?,c#,generics,reflection,C#,Generics,Reflection,我有这个方法: public List<T> SomeMethod<T>( params ) where T : new() 但如果我在运行时只有Class1,我就不能调用它了 那么如何调用未知T类型的SomeMethod呢?我通过反射得到了类型 我有类型的类型,但有些方法不起作用 更新7。可以: 下面是我想要实现的示例代码: using System; using System.Collections.Generic; using System.Linq; using

我有这个方法:

public List<T> SomeMethod<T>( params ) where T : new()
但如果我在运行时只有Class1,我就不能调用它了

那么如何调用未知T类型的SomeMethod呢?我通过反射得到了类型

我有类型的类型,但有些方法不起作用

更新7。可以:

下面是我想要实现的示例代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace ConsoleApplication63
{
    public class DummyClass
    {
    }

    public class Class1
    {
        public string Name;
    }

    class AssemblyTypesReflection
    {
        static void Main(string[] args)
        {
            object obj = new Class1() { Name = "John" } ;

            Assembly assembly = Assembly.GetExecutingAssembly();
            var AsmClass1 = (from i in assembly.GetTypes() where i.Name == "Class1" select i).FirstOrDefault();


            var list = SomeMethod<AsmClass1>((AsmClass1)obj); //Here it fails
        }

        static List<T> SomeMethod<T>(T obj) where T : new()
        {
            return new List<T> { obj };
        }
    }
}

这是一个从更大的上下文中提取的演示。

您需要使用反射来调用它:

var method = typeof(SomeClass).GetMethod("SomeMethod");
method.MakeGenericMethod(someType).Invoke(...);
您可以在C4中使用动态关键字。您还需要.NET 4.0或更高版本:

SomeMethod((dynamic)obj);

运行时推断实际的类型参数并进行调用。如果obj为null,则会失败,因为没有留下任何类型信息。C中的null没有类型。

SLaks很好地回答了您的问题。我只是提醒你,你在这里误用了“匿名”这个词,意思不同。在您的例子中,T是通用的。这是您的API调用还是某个第三方API?如果它是你的,那么考虑改变它,因为泛型不能解决问题,而是在这个案例中创造它。这个想法的可能复制是-我想调用一些方法-并且通常我称它为SomeMethod;但我只知道我想使用的类是Class1或其他类的字符串,它不是关于调用未知方法,而是直到运行时我才知道的参数。如果是1级或2级等,SLaks和sixtlettervariables让我走上了正确的方向。谢谢大家!
SomeMethod((dynamic)obj);