我有一个界面:
public interface InterfaceA<S,T>{}
我想加载实现此接口的所有类的实例,而不管通用参数S
和T
。所以我有一个类,有一个方法来做到这一点。方法签名目前是:
public IEnumerable<object> GetInstancesOfImplementingTypes (Type targetType)
反映已加载的程序集,查找GetGenericTypeDefinition
等于GetGenericTypeDefinition
targetType
的类型。我正在使用类型(而不是在方法上有一个T参数),所以我不必指定泛型参数,即我可以像这样调用它:
var foundinstances = o.GetInstancesOfImplementingTypes(typeof(InterfaceA<,>))
但我似乎必须将找到的类型的实例作为对象返回。有没有什么方法可以返回比仅仅对象更受约束的类型,因为我知道所有实例都是InterfaceA
的一些实现,我只是不知道S
和{{1}将会。
答案 0 :(得分:5)
没有。就CLR而言,InterfaceA<S,T>
的不同实例化是不相关的,因此除非它们具有非通用的公共基础,否则必须使用对象。
如果InterfaceA中有一些成员不依赖于类型参数,并且您希望无论S和T是什么,那么您可能希望创建另一个InterfaceA继承的非泛型接口,仅包含那些成员。
答案 1 :(得分:2)
没有。在.Net中无法声明键入InteraceA<,>
的实例或省略参数的任何泛型类型。
解决这个问题的一种方法是将界面分解为2个界面。一个非泛型的,包含非泛化参数的方法,另一个是通用的,包含方法。然后在这些类型之间创建继承关系。例如
interface InterfaceA {
void SomeOperation();
}
interface InterfaceA<T, S> : InterfaceA {
T SomeOtherOperation(S p1);
}
这允许您通过InterfaceA
扩展方法1>将查询结果作为Cast
的实例进行观察
var foundinstances = o
.GetInstancesOfImplementingTypes(typeof(InterfaceA<,>))
.Cast<InterfaceA>();