我可以返回特定泛型类型的所有通用对象吗?

时间:2011-06-07 15:04:15

标签: .net generics

我有一个界面:

public interface InterfaceA<S,T>{}

我想加载实现此接口的所有类的实例,而不管通用参数ST。所以我有一个类,有一个方法来做到这一点。方法签名目前是:

public IEnumerable<object> GetInstancesOfImplementingTypes (Type targetType)

反映已加载的程序集,查找GetGenericTypeDefinition等于GetGenericTypeDefinition targetType的类型。我正在使用类型(而不是在方法上有一个T参数),所以我不必指定泛型参数,即我可以像这样调用它:

var foundinstances = o.GetInstancesOfImplementingTypes(typeof(InterfaceA<,>))

但我似乎必须将找到的类型的实例作为对象返回。有没有什么方法可以返回比仅仅对象更受约束的类型,因为我知道所有实例都是InterfaceA的一些实现,我只是不知道S和{{1}将会。

2 个答案:

答案 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扩展方法将查询结果作为Cast的实例进行观察

var foundinstances = o
  .GetInstancesOfImplementingTypes(typeof(InterfaceA<,>))
  .Cast<InterfaceA>();