我想在父抽象类中声明以下内容:
public abstract void RefreshDisplay<TView>(Enum value);
然后将在子类中实现,如:
public override void RefreshDisplay<RxViewModel>(RxViews view)
其中RxViews是枚举和&#34;视图&#34;来自该枚举的特定值。
直到运行时才会知道它所来自的实际视图和枚举。
可以这样做吗?我很感激帮助。
编辑:我可能会问这个错误。 TView不是枚举,而是从ViewModelBase继承的视图。 (我不知道这是一个重复的问题吗?)谢谢。
编辑:我猜这是在网络4.5中修复的。有关如何在net 4.0中解决此问题的想法吗?
答案 0 :(得分: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"); }
类型检查是必要的,因为它不是100%确定它是Enum
(tho&#39; Enum
实现所有这些方面,这就是使用它们的原因。)< / p>
您可能需要考虑使用方法virtual
并将其包含在基本方法实现中。
请注意,此代码改编自此处提供的答案:Create Generic method constraining T to an Enum
答案 1 :(得分:0)
您可以使用自定义类而不是枚举。基类可以定义为视图,您可以为每个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; } }
}