Francis Ducharme
Francis Ducharme

Reputation: 4987

C# instantiate enum from another one

I have a web reference that has an enum in it.

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

etc.

Is there any way to create another enum based on WebEnum ? I have been pulling hair for hours on this one.

Thanks!

Upvotes: 0

Views: 682

Answers (2)

Jacob Krall
Jacob Krall

Reputation: 28825

Yes, you can use design-time T4 text templates to generate an enum based on another one.

(You will have to set the assembly name to be appropriate for your WebService enum.)

<#@ 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
}

The GeneratedEnum type will be created at compile time, and will look like this:

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

Upvotes: 2

Reddog
Reddog

Reputation: 15579

No. You can't use inheritance on enums.

However, you can achieve something that feels similar by using static member properties for a class (instead of the enum). This class can then be extended via inheritance.

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

     private static WebEnum _member1 = new WebEnum(1);

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

Then you can extend with

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

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

Disclaimer: In terms of a design, I bet some people would be upset to see it as it probably breaks numerous object oriented design rules... But it should serve purpose...

Upvotes: 5

Related Questions