c# - 是否可以让非泛型方法返回泛型类型?

标签 c# java generics

在 Java 中我可以很容易地写:

public interface MyInterface<T extends Object>

然后有一个在运行时确定 T 的方法,例如:

public MyInterface<?> DetermineObjectAtRuntime()

但在 C# 中 <?>不可用,我需要调用带有类型的方法;这意味着我需要事先知道类型。

  1. 是否可以从非泛型方法返回泛型类型?
  2. 如果没有,如果我有一个具有该类型的对象实例,我如何计算出调用此类泛型方法的类型?

对于不确定这是干什么用的人 - 我有一组数据结构,它们使用不同的枚举作为字段索引器。所有消息都从一个公共(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>使用非泛型方法。当方法仅因返回类型不同时,您必须通过名称更改来消除歧义。修改类型(破坏源代码和二进制兼容性)。

  • 搞砸类型:让方法返回 objectdynamic .有条件地和适本地转换。

    优点:最初很容易做到。

    缺点:更难维护。

关于c# - 是否可以让非泛型方法返回泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20809171/

相关文章:

java - 从字符串中获取 JSONObject

java - 泛型 - 类型中的方法不适用于参数

c# - sqlite 添加 x 天至今(x 存储在表中)

c# - 在 Generic 中实现接口(interface)时,为什么它不是必须实现方法

c# - 我应该为每个类别使用单独的表还是一个表来存储分类网站的所有属性?

c# - 银光数据网格 : Copy & paste

java - Voldemort安装: could not find tools. jar

java - Spring 安全: How to persist each anonymous user?

java - 使用不同泛型类型参数映射值

generics - Kotlin float/int 间接比较