C# 等价于 Java 的 GenericType<?>

标签 c# generics

我正在使用 C# 中的一些泛型。我有一个抽象泛型类:

public abstract class BaseClass<T> where T : Foo { }

其他类继承基类时指定类型参数。

我也在尝试为另一个需要存储这些基类之一的抽象类编写一些代码,但它不会知道基类的参数(而且它不需要知道)。在 Java 中我可以简单地写:

protected BaseClass<?> myBaseClass;

但在 C# 中,它坚持要我给它一个类型参数。如果我将其声明为:

protected BaseClass<Foo> myBaseClass;

我无法分配 BaseClass 的任何参数化值

是否有解决方法来实现 BaseClass<?> 的效果?在 C# 中?显然有一些方法可以重构我的代码以避免这种需要,例如参数化所有使用 BaseClass 的类。也一样,但这不太理想。任何帮助将不胜感激!

最佳答案

为了在某种程度上与 C# 中的 Java 行为相匹配,通常在继承层次结构中放置一个额外的非泛型接口(interface)。

public interface IBaseClass
{
    Foo GetValue();

    void SetValue(Foo value);
}

public abstract class BaseClass<T> : IBaseClass
    where T : Foo
{
    public T GetValue<T>()
    { /* ... */ }

    public void SetValue<T>(T value)
    { /* ... */ }

    Foo IBaseClass.GetValue()    // Explicit interface method implementation
    {
        return (Foo)GetValue<T>();
    }

    void IBaseClass.SetValue(Foo value)    // Explicit interface method impl.
    {
        SetValue<T>((T)value);
    }
}

然后使用IBaseClass你需要的地方BaseClass<?> :

IBaseClass myClass;
Foo f = myClass.GetValue();

关于C# 等价于 Java 的 GenericType<?>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21142571/

相关文章:

c# - WCF 休息服务 http 到 https 错误 404

c# - C# 中的 var 支持 Type1 或 Type2

java - 如有必要,插入类型转换以保持类型安全

c# - 什么是 protobuf-net SerializeWithLengthPrefix 标记参数?

c# - "right"是什么方法可以在事件发生后将 C# 中的方法运行延迟一段时间,同时仍让原始线程运行?

c# - Dapper 查询结果在对象中将表的 Pk 设置为 null

c# - 我怎样才能快速计算字符串出现在字符串列表的给定部分中的频率?

generics - 如何在rust宏中扩展多个特征范围?

c# - 为什么泛型的歧义不一致,而不是引发错误?

创建或 isinstance 的 Python 泛型检查其类型参数