你如何称呼一个通用的方法,如果你只知道在运行时类型参数?(How do you call a gen

2019-06-24 03:55发布

我有这样的方法:

public List<T> SomeMethod<T>( params ) where T : new()

所以我想称之为SomeMethod这是很好的,如果我知道是什么类型:

SomeMethod<Class1>();

但是,如果我只有Class1在运行时,我无法打电话了吗?

因此,如何调用SomeMethod未知T类? 我类型使用反射。

我有型,但的类型SomeMethod<Type | GetType()> SomeMethod<Type | GetType()>不起作用。

更新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 };
        }
    }
}

这是取出一个更大的范围内的演示。

Answer 1:

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

var method = typeof(SomeClass).GetMethod("SomeMethod");
method.MakeGenericMethod(someType).Invoke(...);


Answer 2:

您可以使用dynamic关键字在C#4你需要.NET 4.0或以上,以及:

SomeMethod((dynamic)obj);

运行时推断实际类型参数,并进行呼叫。 它失败如果obj为null,因为那么有没有留下什么类型的信息。 空在C#中没有类型。



文章来源: How do you call a generic method if you only know the type parameter at runtime?