2012-05-03 92 views
0

我有一个Web引用,它有一个枚举。C#实例枚举从另一个

WebService.WebEnum.Member1 
WebService.WebEnum.Member2 
WebService.WebEnum.Member3 

有什么方法来创建基于WebEnum另一个枚举?我一直在这头拉几小时头发。

谢谢!

+0

什么是其他枚举? –

+0

你的意思是创建一个从WebEnum继承的新枚举吗?答案是不,我很害怕 – n8wrl

+0

@ n8wrl,就是这样。我想我必须找到别的东西。 –

回答

5

不可以。您不能在枚举上使用继承。

但是,您可以通过使用类的静态成员属性(而不是枚举)来实现类似的感觉。这个类可以通过继承来扩展。

public class WebEnum 
{ 
    protected WebEnum(int value) 
    { 
     ... 
    } 

    private static WebEnum _member1 = new WebEnum(1); 

    public static WebEnum Member1 
    { 
     get { return _member1; } 
    } 
} 

然后你就可以用

public class OtherWebEnums : WebEnums 
{ 
    private static WebEnum _member4 = new WebEnum(4); 

    public static WebEnum Member4 
    { 
      get { return _member4; } 
    } 
} 

免责声明扩展:在设计方面,我敢打赌,有些人会不高兴看到它,因为它可能打破了无数的面向对象设计规则......但是它应该服务于...

+0

一些规则应该被打破:) – paulsm4

+0

我想说的一件事就是它现在是一个引用类型,而不是一个值类型,可能会产生意想不到的后果。但是,价值类型不能被继承,这是唯一的出路。只要确保类型是不可变的,并声明一个隐式转换为int,并且大多数关注它的引用类型都会消失。 – KeithS

+0

@KeithS - 伟大的提示!建议使用私有/受保护的构造函数来控制实例化。 – Reddog

1

是的,你可以使用design-time T4 text templates生成一个基于另一个枚举。

(您必须设置集名称是适合你的WebService的枚举。)

<#@ template debug="false" hostspecific="false" language="C#" #> 
<#@ assembly name="$(SolutionDir)WebService\bin\Debug\WebService.Dll" #> 
<#@ output extension=".cs" #> 
enum GeneratedEnum 
{ 
<# foreach(var member in Enum.GetValues(typeof(WebService.WebEnum))){ #> 
    <#= member #>, 
<# } #> 
    AdditionalMember1, 
    AdditionalMember2 
} 

GeneratedEnum类型将在编译时创建的,并且看起来像这样:

enum GeneratedEnum 
{ 
    Member1, 
    Member2, 
    Member3, 
    AdditionalMember1, 
    AdditionalMember2 
}