在 Java 中我可以很容易地写:
public interface MyInterface<T extends Object>
然后有一个在运行时确定 T 的方法,例如:
public MyInterface<?> DetermineObjectAtRuntime()
但在 C# 中 <?>
不可用,我需要调用带有类型的方法;这意味着我需要事先知道类型。
- 是否可以从非泛型方法返回泛型类型?
- 如果没有,如果我有一个具有该类型的对象实例,我如何计算出调用此类泛型方法的类型?
对于不确定这是干什么用的人 - 我有一组数据结构,它们使用不同的枚举作为字段索引器。所有消息都从一个公共(public)通用接口(interface)扩展而来,该接口(interface)以该枚举作为类型变量。现在我需要制定一种方法来反序列化 byte[] 数组中所有不同类型的消息。
最佳答案
在没有类型删除的 C# 中,有几种方法可以解决在编译时不知道类型参数的问题:
非泛型子集:如果恰好是
MyInterface<T>
的方法你需要的不涉及T
,然后您可以将接口(interface)的那部分提取到基接口(interface)中,然后返回基接口(interface)。优点:没有运行时类型的恶作剧。
缺点:修改类型(将方法移动到新的基础接口(interface)),破坏二进制兼容性。
类型检查包装器:制作一个
RuntimeTypeCheckedMyInterface<T>
实现MyInterface<object>
的类通过委托(delegate)给MyInterface<T>
类型检查后。让方法返回MyInterface<object>
, 通过包装MyInterface<whatever>
创建在RuntimeTypeCheckedMyInterface
里面.Pro:适用于任何现有接口(interface)类型,无需修改。
Con:引入“T=object 真的意味着对象,还是意味着未知类型”?歧义。
手动类型删除:制作
MyInterface<T>
的变体没有像MyInterfaceOfUnknownType
这样的 T .制作MyInterface<T>
继承自MyInterfaceOfUnknownType
.让你的方法返回MyInterfaceOfUnknownType
.Pro:行为与 Java 基本相同,带有
MyInterfaceOfUnknownType
=MyInterface<?>
.缺点:污染
MyInterface<T>
使用非泛型方法。当方法仅因返回类型不同时,您必须通过名称更改来消除歧义。修改类型(破坏源代码和二进制兼容性)。搞砸类型:让方法返回
object
或dynamic
.有条件地和适本地转换。优点:最初很容易做到。
缺点:更难维护。
关于c# - 是否可以让非泛型方法返回泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20809171/