我在低级命名空间中有一个枚举 . 我想在一个“继承”低级枚举的中级命名空间中提供一个类或枚举 .
namespace low
{
public enum base
{
x, y, z
}
}
namespace mid
{
public enum consume : low.base
{
}
}
我希望这是可能的,或者某种类可以代替枚举消耗,它将为枚举提供一层抽象,但仍然让该类的实例访问枚举 .
思考?
编辑:我之前没有将其转换为类中的consts的原因之一是我必须使用的服务需要低级枚举 . 我得到了WSDL和XSD,它们将结构定义为枚举 . 该服务无法更改 .
13 回答
这是不可能的 . 枚举不能从其他枚举继承 . 事实上,所有枚举必须实际上从
System.Enum
继承 . C#允许语法更改看起来像继承的枚举值的基础表示,但实际上它们仍然继承自System.enum .有关详细信息,请参见CLI spec的第8.5.2节 . 来自规范的相关信息
所有枚举必须来自
System.Enum
由于上述原因,所有枚举都是值类型,因此是密封的
您可以通过课程实现您想要的目标:
现在,您可以使用与枚举时类似的类:
Update (更新问题后):
如果将相同的int值分配给现有枚举中定义的常量,则可以在枚举和常量之间进行转换,例如:
最简洁的答案是不 . 如果你愿意,你可以玩一点:
你总是可以这样做:
但是,它并没有那么好用,因为Base.A!= Consume.A
但是你可以做这样的事情:
为了跨越基地和消费...
您还可以将枚举的值转换为整数,并将它们作为整数而不是整数进行比较,但这种方式也很糟糕 .
扩展方法返回应该键入类型T的类型 .
使用具有int常量的类的上述解决方案缺乏类型安全性 . 即您可以创建实际上未在类中定义的新值 . 此外,例如,不可能编写将这些类之一作为输入的方法 .
你需要写
但是,当没有可用的枚举时,有一个基于类的Java解决方案 . 这提供了几乎类似于枚举的行为 . 唯一需要注意的是,这些常量不能在switch语句中使用 .
忽略base是保留字的事实,你不能继承enum .
你能做的最好的事情是:
由于它们都是相同的基类型(即:int),因此您可以将一个类型的实例的值分配给另一个类型的实例 . 不理想,但它的工作 .
我知道这个答案有点晚了,但这就是我最终做的事情:
Then I am able to do things like:
这就是我所做的 . 我所做的不同的是在"consuming"
enum
上使用相同的名称和new
关键字 . 由于enum
的名称是相同的,你可以盲目地使用它,它是正确的 . 另外,你得到intellisense . 您只需在设置时手动注意从基础复制值并保持同步 . 您可以提供代码注释 . 这是另一个原因,在数据库中存储enum
值时,我总是存储字符串,而不是值 . 因为如果使用自动分配的递增整数值,那么这些值可能会随时间而变化 .枚举不是实际的类,即使它们看起来像它 . 在内部,它们被视为基础类型(默认情况下为Int32) . 因此,您只能通过将单个值从一个枚举“复制”到另一个枚举并将它们转换为整数来比较它们的相等性来实现 .
枚举不能从其他枚举中获取,而只能从int,uint,short,ushort,long,ulong,byte和sbyte中获取 .
就像Pascal所说,你可以使用其他枚举值或常量来初始化枚举值,但这就是它 .
另一个可能的解
HTH
这是不可能的(正如@JaredPar已经提到的那样) . 试图让逻辑解决这个问题是一种不好的做法 . 如果你有
base class
有一个enum
,你应该列出所有可能的enum-values
,并且class的实现应该使用它知道的值 .例如 . 假设你有一个基类
BaseCatalog
,它有enum ProductFormats
(Digital
,Physical
) . 然后你可以拥有一个MusicCatalog
或BookCatalog
,它可以包含Digital
和Physical
产品,但如果该类是ClothingCatalog
,它应该只包含Physical
产品 .我还想重载Enums并创建了the answer of 'Seven' on this page和the answer of 'Merlyn Morgan-Graham' on a duplicate post of this的混合,以及一些改进 .
我的解决方案主要优于其他解决方案:
底层的自动增量int值
自动命名
这是一个开箱即用的解决方案,可以直接插入您的项目中 . 它是根据我的需求而设计的,所以如果你不喜欢它的某些部分,只需用你自己的代码替换它们 .
首先,所有自定义枚举都应该继承的基类
CEnum
. 它具有基本功能,类似于.netEnum
类型:其次,这里有2个派生的Enum类 . 所有派生类都需要一些基本方法才能按预期工作 . 它始终是相同的样板代码;我还没有找到将其外包给基类的方法 . 第一级继承的代码与所有后续级别略有不同 .
已经使用以下代码成功测试了这些类:
您可以在枚举中执行继承,但它仅限于以下类型 . int,uint,byte,sbyte,short,ushort,long,ulong
例如 .