我有一个班级:
public abstract class Criteria
{
public virtual Enum Field
{
get; set;
}
public string FieldData;
}
我有一个枚举:
public enum MyFieldsEnum
{
Name=1,
Age=2,
Gender=3,
}
我有一个继承的类:
public class MyCriteria : Criteria
{
MyFieldsEnum myfields;
public override MyFieldsEnum Field
{
get
{
return myfields;
}
set
{
base.Field = value;
}
}
}
想法是返回MyFieldsEnum而不是空白枚举 领域。但上面的代码不起作用,也不接受 MyFieldsEnum for Field。 它给出错误:"类型必须是枚举以匹配被覆盖的成员Criteria.Field"
是否可能以某种方式或其他方式?
答案 0 :(得分:3)
我的投票是将其更改为使用泛型。
public abstract class Criteria<TEnum>
where TEnum : struct, IConvertable
{
public T Field { get; set; }
}
public class MyCriteria : Criteria<MyFieldsEnum>
{
// No need to override Field
}
警告C#/ CLR目前不支持enum作为类型约束。你可以做你想做的事,但这里有更多的信息:Create Generic method constraining T to an Enum
答案 1 :(得分:1)
由于您无法覆盖基类中的Enum
,因此您可以使用generics
来使用通用约束,因为Enum
是struct
和IConvertible
( 另外,请阅读最后的说明):
public abstract class Criteria<T> where T : struct, IConvertible
{
public virtual T Field
{
get; set;
}
public string FieldData;
}
public class MyCriteria : Criteria<MyFieldsEnum>
{
MyFieldsEnum myfields;
public override MyFieldsEnum Field
{
get
{
return myfields;
}
set
{
base.Field = value;
}
}
}
其他方法是在运行时检查这个,但这样做风险更大,并且需要使用此类的开发人员知道Enum
方法返回的get
为MyFieldsEnum
:< / p>
public class MyCriteria : Criteria
{
MyFieldsEnum myfields;
public override Enum Field
{
get
{
return myfields;
}
set
{
if (!(value is MyFieldsEnum))
{
throw new InvalidOperationException("Cannot set enums other than MyFieldsEnum");
}
base.Field = value;
}
}
}
注意:无论如何,在您这样做之前,您应该重新考虑Enum
作为您的抽象类型,因为如果您考虑它,任何将Criteria
称为{{abstract class
的代码1}}必须知道您正在使用的实际Enum
才能做某事,所以如果这种抽象确实给你带来任何好处,你最好是安全的并重新考虑 。