我试图将对象或类型传递给接受泛型类型的类

时间:2016-01-22 19:57:29

标签: .net generics c#-4.0

Type hai = Type.GetType("TestStringObject", true);
var obj = (Activator.CreateInstance(hai));
tata = CreateClass<obj>();

我想做类似的事情,但是泛型类没有将obj识别为对象或类型?

我可以这样做吗?

1 个答案:

答案 0 :(得分:0)

在您的示例中,当您使用obj作为对象的实例时,您将其用作类型。泛型类型参数必须是类,而不是实例或类型,并且必须在编译时才能知道。

如果TestStringObject是项目中的类,则可以将其用作泛型类型参数,如下所示:

tata = CreateClass<TestStringObject>();

如果在编译时不知道类型,可以在运行时创建一个通用方法来匹配未知类型(作为字符串提供),并以这种方式调用泛型方法。在下面的示例中,我将假设有一个名为TestStringObject的类具有名为CreateClass的通用方法;您的具体情况可能会有所不同,但这应该可以满足您的需求:

TestStringObject:

namespace Test
{
    class TestStringObject
    {
        public void CreateClass<T>()
        {
            Console.WriteLine("CreateClass Invoked");
        }
    }
}

...别处

// Get the type of the unknown type, provided here as a string.
Type type = Type.GetType("Test.TestStringObject", true);
// Create an instance of the unknown type.
object obj = Activator.CreateInstance(type);
// Get a reference to the 'CreateClass' generic method info.
MethodInfo method = type.GetMethod("CreateClass");
// Get a reference to a version of the generic method that accepts the unknown type as a generic type argument.
MethodInfo genericMethod = method.MakeGenericMethod(type);
// Invoke the generic method of the unknown type.
genericMethod.Invoke(obj, new object[] { });

请注意命名空间,在调用GetType时必须包含该命名空间,因为它需要一个完全限定的名称。