通用枚举作为方法参数

Tom*_*len 8 c# generics enums

给定一个构造函数

public MyObject(int id){
    ID = id;
}
Run Code Online (Sandbox Code Playgroud)

两个枚举:

public enum MyEnum1{
    Something = 1,
    Anotherthing = 2
}

public enum MyEnum2{
    Dodo = 1,
    Moustache= 2
}
Run Code Online (Sandbox Code Playgroud)

是否可以传入通用枚举作为构造函数的参数?我正在寻找一个解决方案:

public MyObject(enum someEnum){
    ID = (int)someEnum;
}
Run Code Online (Sandbox Code Playgroud)

所以你可以这样做:

var newObject = new MyObject(MyEnum1.Something);
var anotherObject = new MyObject(MyEnum2.Dodo);
Run Code Online (Sandbox Code Playgroud)

Mar*_*ans 6

为什么要传递枚举,而又可以传递整数?

var newObject = new MyObject((int)MyEnum1.Something);
var anotherObject = new MyObject((int)MyEnum2.Dodo);
Run Code Online (Sandbox Code Playgroud)

并使用您的第一个构造函数:

public MyObject(int id){
    ID = id;
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,这就是我已经在做的,如果我可以直接传递枚举,它将看起来更具可读性 (2认同)

ser*_*iyb 6

另一种选择是:

public MyObject(Enum someEnum){
    ID = Convert.ToInt32(someEnum);
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以按照自己的要求使用它,而无需int每次调用contstructors时都使用它:

var newObject = new MyObject(MyEnum1.Something);
var anotherObject = new MyObject(MyEnum2.Dodo);
Run Code Online (Sandbox Code Playgroud)


Him*_*ere 5

只需使用通用构造函数:

class MyObject<T> {

    public MyObject(T someEnum) where T : struct, IConvertible
    {
        if (!typeof(T).IsEnum) 
            throw new ArgumentException("Not an enum");
        ID = Convert.ToInt32(someEnum);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以像这样轻松调用它:

var m = new MyObject<MyEnum>(MyEnum1.Something);
Run Code Online (Sandbox Code Playgroud)

但更容易将枚举作为整数传递给构造函数,如其他答案中所述.