【发布时间】:2014-11-10 20:00:23
【问题描述】:
System.Type 如何成为具有约束的通用参数?
这里的接口I 有一个方法M,类C 和D 实现。
public interface I {
void M;
}
public class C: I {
public void M();
}
public class D: I {
public void M();
}
Service 实例化一个新的 T()(实际上是 C/D 实现 I)并在其上运行 I 接口方法
public class Service {
public void Fn<T>(T t): where T : Type, I, new() {
( new t() ).M();
// ...
}
}
这最终将成为服务的公共 API,因此我希望它尽可能简洁:
public class Main {
public void main() {
Service.Fn( typeof( C ));
Service.Fn( typeof( D ));
// ...
}
}
这不是编译,错误是:
'System.Type' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'T' in the generic type or method ...
这里的最终目标是能够简洁地调用Service.Fn,如Main 中所述。也欢迎我的接口尝试的任何替代方案。
【问题讨论】:
-
您是否要创建
C/D?如果是这样,您应该使用通用参数,例如Service.Fn<C>()。 -
C 和 D 是类型,但它们不继承
Type。此外,您似乎不了解类型对象(例如,typeof(C))和类型标记(例如,Service.Fn<C>())之间的区别 -
除了语法之外,类型对象和类型标记有什么区别?
标签: c# generics types interface constraints