在Java中,我可以轻松地编写:
public interface MyInterface<T extends Object>
然后有一个在运行时确定T的方法,例如:
public MyInterface<?> DetermineObjectAtRuntime()
但是在C#中<?>
不可用,我需要用type调用方法;这意味着我需要事先了解类型。
对于不确定这是什么目的的人-我有一组数据结构,这些数据结构使用不同的枚举作为字段索引器。所有消息均从具有该枚举类型变量的通用通用接口扩展而来。现在,我需要设计一种从byte []数组反序列化所有不同类型消息的方法。
在C#中,您可以使用通用方法:
class Foo<X>
{
public T DoSomethingFunky<T>( ... )
{
...
}
}
但是没有办法使用通配符类型-C#中的一个重大失败。在很多情况下这是非常有用的,Widget<T>
但您不在乎的细节T
。
例如,WCF throws FaultException<T>
,其中各种风格T
是特定于服务的。FaultException<*>
如果不简单地捕获基Exception
类并使用反射来检查捕获的异常以查看是否有趣,就无法捕获类似的东西T
。这样可以防止以一般方式处理服务故障。
我认为原因是,具体的泛型类(Widget<int>
)并不是Widget<T>
其“继承”的泛型类()的真正子类型。泛型类仅用作模板来编译新的特定类。
您可以做的一件事就是让您的通用模板(Widget<T>
)从非通用基类(Widget
)继承,并让您的方法返回:
class AbstractWidget { ... }
class Widget<T> : AbstractWidget { ... }
.
.
.
public Widget GetGeneric Widget()
{
/* flavor determinated at runtime */
}
调用者有责任决定如何使用其Widget。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句