繁体   English   中英

Java的GenericType的C#等效项<?>

[英]C# Equivalent of Java's GenericType<?>

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

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

当其他类从基类继承时,指定type参数。

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

protected BaseClass<?> myBaseClass;

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

protected BaseClass<Foo> myBaseClass;

我不能为其分配任何BaseClass参数化的值。

是否可以解决C#中BaseClass<?>问题? 显然,有一些方法可以重组我的代码来避免这种需要,例如,对所有使用BaseClass的类进行参数BaseClass ,但这并不理想。 任何帮助,将不胜感激!

为了在C#中稍微匹配Java的行为,通常在继承层次结构中放置一个额外的非泛型接口。

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);
    }
}

然后在需要BaseClass<?>地方使用IBaseClass

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

如果您还不知道该类的通用参数,则使用该类型的类也将需要通用。

如果在方法的参数声明中使用通配符,则需要使该方法通用:

void printBaseClass<T>(BaseClass<T> o) where T : Foo {
  // ...
}

如果将其用作变量类型声明,则只需使用var

var o = GetBaseClassOfSomeType();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM