我已经梳理了关于这个问题的现有问题/答案,但没有一个以我理解的方式准确地说明我在寻找什么。这是我的片段:
Type t = **?**
_SecondRole.ProvisionRelationship<t>(_FirstRole);
我相信我应该在这里使用反射,尽管我不完全理解如何。我如何定义“t”以便这个工作?
感谢您提供任何帮助。
如果_FirstRole
是 unknown 的一个实例t
,例如来自:
object _FirstRole = Activator.CreateInstance(t);
那么你可以dynamic
在这里利用:
dynamic _FirstRole = Activator.CreateInstance(t); // or whatever
_SecondRole.ProvisionRelationship(_FirstRole);
第二行现在是一个dynamic
语句,在运行时部分评估(但有一些巧妙的缓存使用) - 这意味着它可以从取消引用的对象的实际类型_FirstRole
执行泛型类型推断。
如果不是这种情况,那么调用它的唯一方法是通过GetMethod
and MakeGenericMethod
- 这是笨拙且效率不高的。在那种情况下,我强烈建议重构_SecondRole.ProvisionRelationship
以接受Type
参数,而不仅仅是泛型;您当然仍然可以提供通用版本以避免影响现有代码:
void ProvisionRelationship(Type type, SomeType role) {...}
void ProvisionRelationship<T>(SomeType role) {
ProvisionRelationship(typeof(T), role);
}
并调用为:
_SecondRole.ProvisionRelationship(t, _FirstRole);