繁体   English   中英

通用枚举作为方法参数

[英]Generic enum as method parameter

给定一个构造函数

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

另一种选择是:

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

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

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

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

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

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

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

只需使用通用构造函数:

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

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

var m = new MyObject<MyEnum>(MyEnum1.Something);

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

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

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

您使用属性枚举或参数。

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

就试一试吧。 我希望它有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM