通用枚举作为方法参数

时间:2016-09-08 13:26:30

标签: c# generics enums

给定构造函数

public MyObject(int id){
    ID = id;
}

两个枚举:

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

public enum MyEnum2{
    Dodo = 1,
    Moustache= 2
}

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

public MyObject(enum someEnum){
    ID = (int)someEnum;
}

所以你可以这样做:

var newObject = new MyObject(MyEnum1.Something);
var anotherObject = new MyObject(MyEnum2.Dodo);

5 个答案:

答案 0 :(得分:6)

另一种选择是:

public MyObject(Enum someEnum){
    ID = Convert.ToInt32(someEnum);
}

通过这种方式,您可以按照自己的要求使用它,而无需在每次打电话给你的contstructors时投射到int

var newObject = new MyObject(MyEnum1.Something);
var anotherObject = new MyObject(MyEnum2.Dodo);

答案 1 :(得分:5)

只需使用通用构造函数:

<script>

现在您可以轻松地将其称为:

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);
    }
}

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

答案 2 :(得分:4)

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

var newObject = new MyObject((int)MyEnum1.Something);
var anotherObject = new MyObject((int)MyEnum2.Dodo);

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

public MyObject(int id){
    ID = id;
}

答案 3 :(得分:0)

好吧,如果你真的需要为各种类型打造这个通用调用,那么恕我直言你应该使用:

  1. Type.IsEnum检查您的参数是否真的是Enum;
  2. Enum.GetUnderlyingType了解您的参数所基于的类型(它不一定是Int32);
  3. 现在投射你的物体。

    public static Int32 GetAnInt<T>(T arg) where T : struct
    {
        if ((typeof(T).IsEnum))
        {
            var underlyingType = typeof(T).GetEnumUnderlyingType();
            if (underlyingType == typeof(Int32)
            || underlyingType == typeof(Int16)) //etc.
            {
                try
                {
                    dynamic value = arg;
                    var result = (Int32)value; // can throw InvalidCast!
                    return result;
                }
                catch
                {
                    throw;
                }
            }
            else
            {
                throw new InvalidCastException("Underlying type
                             is certainly not castable to Int32!");
            }
        }
        else
        {
            throw new InvalidCastException("Not an Enum!");
        }
    }
    

    通过这种方式,您可以实现美妙的语法:var j = GetAnInt(MyEnum.FirstValue);

答案 4 :(得分:-1)

您使用的是属性枚举还是参数。

public enum Enum1{}
public Enum1 enum1 { get;set; }
public MyObject()
{
   ID = (int)enum1;
}

试试吧。我希望它很有用。