繁体   English   中英

如何声明一个泛型类型使用的枚举?

[英]How to declare an Enum to be used by a generic type?

我想在父抽象类中声明以下内容:

  public abstract void RefreshDisplay<TView>(Enum value);

然后将在子类中实现,如:

   public override void RefreshDisplay<RxViewModel>(RxViews view)

其中RxViews是枚举,并从该枚举“查看”特定值。

直到运行时才会知道它来自的实际视图和枚举。

可以这样做吗? 我很感激帮助。

编辑:我可能会问这个错误。 TView不是枚举,而是从ViewModelBase继承的视图。 (我不知道这是一个重复的问题?)谢谢。

编辑:我猜这是在4.5中修复的。 任何想法如何在net 4.0中解决这个问题?

您需要在.NET 4.0中使用Enum泛型的约束类型如下 - 请注意,您需要更改类声明才能使其正常工作:

public abstract class BaseClass<TView, TEnum> 
    where TView: ViewModelBase
    where TEnum : struct,  IComparable, IFormattable, IConvertible
{

    public abstract void RefreshDisplay<TView, TEnum>(TEnum value);
}

但是,您应该在方法的实现中执行类似于以下行的操作:

if (!typeof(TEnum).IsEnum) { throw new ArgumentException("TEnum must be an enumerated type"); }

类型检查是必要的,因为它不是100%确定它是一个Enum (因为' Enum实现所有这些方面,这就是它们被使用的原因)。

您可能想要考虑将方法设置为virtual并将其包含在基本方法实现中。

请注意,此代码根据此处提供的答案进行了改编: 创建将T限制为枚举的通用方法

您可以使用自定义类而不是枚举。 基类可以定义为视图,您可以为每个TView继承它,并为每个值提供静态实例。

public abstract class A
{
    public abstract void RefreshDisplay<TView>(Views<TView> value);
}

public abstract class Views<TView>
{
    internal Views() {} //Used to disallow inheriting from outside, not mandatory...

    //You can add other methods/properties to allow processing in RefreshDisplay method
}

public sealed class RxViews : Views<TView>
{
    private RxViews() {}

    private static readonly RxViews myFirstRxView = new RxViews();
    public static RxViews MyFirstRxView { get { return myFirstRxView; } }
}

暂无
暂无

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

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