如何动态创建泛型类型以传递给泛型方法?

时间:2013-03-04 05:01:36

标签: c# generics types

我已经在这个问题上梳理了现有的问题/答案,但是他们都没有按照我理解的方式拼写出我正在寻找的东西。这是我的片段:

Type t = **?**

_SecondRole.ProvisionRelationship<t>(_FirstRole);

我相信我想在这里使用反思,虽然我不完全明白如何。如何定义“t”这样有用呢?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

如果_FirstRole是未知t的实例,例如来自:

object _FirstRole = Activator.CreateInstance(t);

然后你可以在这里利用dynamic

dynamic _FirstRole = Activator.CreateInstance(t); // or whatever
_SecondRole.ProvisionRelationship(_FirstRole);

第二行现在是dynamic语句,部分在运行时评估(但有一些聪明的缓存使用) - 这意味着它可以从实际类型执行泛型类型推断从_FirstRole取消引用的对象。


如果那是的情况,那么调用它的唯一方法是通过GetMethodMakeGenericMethod - 这是笨拙且效率不高的。在那种情况下,我强烈建议重构_SecondRole.ProvisionRelationship以接受Type参数,而不仅仅是通用;您当然可以提供通用版本以避免影响现有代码:

void ProvisionRelationship(Type type, SomeType role) {...}
void ProvisionRelationship<T>(SomeType role) {
    ProvisionRelationship(typeof(T), role);
}

并调用为:

_SecondRole.ProvisionRelationship(t, _FirstRole);