将动态类型传递给通用模板

时间:2015-11-10 09:52:55

标签: c# generics reflection

我正面临着C#反思的问题。我需要构造一个通用反射动态实例化类类型的泛型方法。我尝试的是以下内容。

Type myClass = Type.GetType(deviceBehavior.@class);
Type myInterfaceClass = myClass.GetInterface(deviceBehavior.@interface);

if (typeof (AnotherInterface).IsAssignableFrom(interfaceClass))
{
    CreateManager<interfaceClass>(serviceProvider, deviceCapability);
}

我的CreateManager方法如下:

private void CreateManager<T>(ServiceProvider serviceProvider, DeviceCapability deviceCapability)
{
    T instanceToCreate = CreateClass<T>(serviceProvider, deviceCapability);
    //Code to instantiate my class
}

问题是我无法打电话

  

CreateManager(serviceProvider,deviceCapability);

如何将接口传递给我的通用类型?我搜查了一下,找不到任何我能清楚理解的东西。即

Calling a static method on a generic type parameter

Pass An Instantiated System.Type as a Type Parameter for a Generic Class

2 个答案:

答案 0 :(得分:2)

让我们说CreateManager<T>Foo类型的方法:

public class Foo
{
    private void CreateManager<T>(ServiceProvider serviceProvider,
                                  DeviceCapability deviceCapability)
    {
    }
}

为了动态调用泛型方法,您需要先获取MethodInfo,然后使用您要传递的实际类型调用MakeGenericMethod(我选择string例子)

var foo = new Foo();
var createManagerMethod = foo.GetType()
                             .GetMethod("CreateManager", 
                                         BindingFlags.Instance | BindingFlags.NonPublic);

var method = createManagerMethod.MakeGenericMethod(typeof(string));
method.Invoke(foo, new object[] { new ServiceProvider(), new DeviceCapability() });

最后,使用正确的对象实例和参数调用Invoke

答案 1 :(得分:0)

我不明白,为什么你需要反思呢。你可以这样做,如下所示

  byte[] img=c.getBlob(c.getColumnIndexOrThrow("Image"));