使用C# 3.0、.NET 3.5
我需要一个比简单数字更智能的枚举。我已经使用静态类和属性解决了这个问题,但我缺少的一件事是,在不访问特定属性的情况下,可以像使用位标志一样使用枚举。
例如,这是可行的:
public interface isomething
{
int value { get; }
}
public class something : isomething
{
public int value {get; private set;}
public somthing(int value)
{
this.value = value
}
public void DoSomething()
{
throw new NotImplementedException();
}
}
public static class SuperEnum
{
public static isomething first = new something(1);
public static isomething second= new something(2);
}然后执行下面这样的代码:
Assert.IsTrue((SuperEnum.first.value | SuperEnum.second.value) == 3);你会得到一个真的。但是如果我将这个添加到something类中:
public static int operator | (something leftSide, isomething rightside)
{
return leftside.value | rightside.value
}然后执行下面这样的代码:
Assert.IsTrue((SuperEnum.first | SuperEnum.second) == 3);我得到了一条消息:|运算符不能用于isomething类型,这很糟糕。
如果我使用具体的类型,我很好,但这将在未来带来问题。
有人有什么想法吗?
谢谢,马克
发布于 2009-10-15 05:25:22
我不确定你想要达到什么目的。我认为这个问题可能有更好的解决方案,但如果运算符很重要,你可以使用抽象类而不是接口来实现:
public abstract class SomethingBase
{
protected int value;
protected SomethingBase(int value)
{
this.value = value;
}
public static int operator |(SomethingBase leftSide, SomethingBase rightside)
{
return leftSide.value | rightside.value;
}
}
public class Something : SomethingBase
{
public int Value
{
get { return value; }
}
public Something(int value) : base(value)
{
}
public void DoSomething()
{
throw new NotImplementedException();
}
}发布于 2009-10-15 05:04:37
您的问题来自于这样一个事实:ISomething接口没有声明操作符,我不确定您是否可以将操作符作为接口契约的一部分。使用具体类会导致什么类型的问题?
发布于 2009-10-15 05:22:51
如果你在做二进制数学运算,听起来就像是在谈论一个值。如果您正在谈论一个值,那么不可变的具体类型将是一个很好的选择(可能是struct,具体取决于大小)。如果你有一个具体的类型,你可以添加一个定制的操作符。
或者,您可以向接口添加一个Or方法(或添加一个扩展方法来执行相同的操作),但这可能涉及到第一个操作数选择具体类型……但话说回来,我不确定界面到底添加了什么。
https://stackoverflow.com/questions/1570348
复制相似问题