是否有可能让非泛型方法返回泛型类型?

Ale*_*Suo 2 c# java generics

在Java中我可以轻松地写:

public interface MyInterface<T extends Object>
Run Code Online (Sandbox Code Playgroud)

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

public MyInterface<?> DetermineObjectAtRuntime()
Run Code Online (Sandbox Code Playgroud)

但是在C#中哪里<?>不可用,我需要用类型调用方法; 这意味着我需要事先了解类型.

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

对于那些不确定这是什么的人 - 我有一组数据结构,它们使用不同的枚举作为字段索引器.所有消息都从具有该枚举的公共通用接口扩展为类型变量.现在我需要编写一个方法,从byte []数组反序列化所有不同类型的消息.

Cra*_*ney 5

在C#中,没有类型擦除,有几种方法可以在编译时不知道类型参数:

  • 非泛型子集:如果恰好是MyInterface<T>您需要的方法不涉及的情况T,那么您可以将接口的该部分提取到基接口并返回基本接口.

    亲:没有运行时类型的恶作剧.

    Con:修改类型(将方法移动到新的基本接口),打破二进制兼容性.

  • 类型检查包装器:通过委托后类型检查来创建一个RuntimeTypeCheckedMyInterface<T>实现MyInterface<object>MyInterface<T>类.让方法返回一个MyInterface<object>,通过包装MyInterface<whatever>内部创建一个RuntimeTypeCheckedMyInterface.

    Pro:适用于任何现有的接口类型,无需修改.

    Con:介绍"T =对象真的意味着对象,还是意味着未知类型"?歧义.

  • 手动类型擦除:制作一个MyInterface<T>没有T类的变体MyInterfaceOfUnknownType.让MyInterface<T>继承MyInterfaceOfUnknownType.让你的方法回归MyInterfaceOfUnknownType.

    Pro:行为基本上与Java相同,MyInterfaceOfUnknownType= MyInterface<?>.

    Con:MyInterface<T>使用非通用方法污染.当方法仅因返回类型而不同时,您必须使用名称更改来消除歧义.修改类型(中断源和二进制兼容性).

  • 拧紧类型:方法返回objectdynamic.有条不紊地适当地施放.

    亲:最初很容易做到.

    骗局:难以维持.