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

4

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

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

然后在子类中实现:

   public override void RefreshDisplay<RxViewModel>(RxViews view)

RxViews是一个枚举类型,“view”是该枚举中的特定值。

实际视图和枚举的来源直到运行时才能确定。

这可以做到吗?感谢您的帮助。

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

编辑:我猜这在net 4.5中已经修复了。有什么办法可以在net 4.0中解决这个问题吗?


1
C#中的枚举类型约束 - Vladimirs
1
为什么不使用两种泛型类型,一个用于viewModel,另一个用于枚举,就像这样:public abstract void RefreshDisplay<TView,TEnum>(TEnum value)where TEnum:Enum; - lombardo
2
您可以使用自定义类来替代枚举。基类可以定义为Views<TView>,您可以为每个TView继承它并为每个值提供静态实例。 - Guillaume
1
很难在没有实际情况下做出判断。不要过于强调类型安全性;将所有内容都适配到一起可能是一个很好的思维锻炼,但有时候上转型和断言更易读且更实用,而且类型理论本身也存在一些松散的边缘。 - Dax Fohl
2
还可以考虑使用Java风格的枚举:https://dev59.com/NnRB5IYBdhLWcg3w6bYE#469315 - Dax Fohl
显示剩余13条评论
2个回答

12

在.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"); }

类型检查是必要的,因为不能百分之百确定它是一个枚举类型(虽然枚举类型实现了所有这些方面,这就是它们被使用的原因)。您可能希望考虑将方法设置为虚拟的,并将其包含在基本方法实现中。请注意,此代码改编自此处提供的答案:Create Generic method constraining T to an Enum

他该如何在子类的重写方法中指定泛型类? - Dax Fohl
他的类将变成 class ViewModelBase<TView, TEnum> - toadflakz
抽象方法不能包含方法体! - Vladimirs

0
你可以使用自定义类来代替枚举。基类可以被定义为 Views,你可以为每个 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; } }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接