如何运行从泛型类返回“类型”对象的方法

时间:2014-10-07 08:36:23

标签: c# generics reflection typeof

你能帮我解决一个问题。我想初始化并使用这样一个类:

public class GenericClass<T>
{
    public static T Method(string xml)
    {
       ...
    }
}

我想做的是:

public void do(Type _type)
{
    var genObj = new GenericClass<_type>();  // Error
    var result = genObj.Method("parameter");
}

我已经找到了如何初始化GenericClass here,但我真的不知道如何运行此实例的方法,该方法返回初始化中使用的类型。

1 个答案:

答案 0 :(得分:1)

您实际要问的是如何使用反射创建GenericClass<T>的动态实例。这是它的工作原理:

var genericTypeDefinition = typeof(GenericClass<>);
var concreteType = genericTypeDefinition.MakeGenericType(_type);
var instance = Activator.CreateInstance(concreteType); // Calls default constructor.

如果要调用某些instance.Method(),则必须将实例强制转换为更具体的类型(因为CreateInstance只返回一个对象)。我建议您定义一个定义此方法的接口,让GenericClass<>实现此接口,以便您可以在运行时安全地转换为此接口并调用所需的方法:

interface ISomeInterface
{
    object Method(string xml);
}

class GenericClass<T> : ISomeInterface
{
    void object ISomeInterface.Method(string xml)
    {
        return Method(xml);
    }

    public T Method(string xml)
    {
    }
}

然后:

var genericTypeDefinition = typeof(GenericClass<>);
var concreteType = genericTypeDefinition.MakeGenericType(_type);
var instance = (ISomeInterface) Activator.CreateInstance(concreteType); // Calls default constructor.

instance.Method("parameter");