C# 泛型枚举作为方法参数

C# 泛型枚举作为方法参数,c#,generics,enums,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){

给定一个构造函数

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

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

var newObject = new MyObject((int)MyEnum1.Something);
var anotherObject = new MyObject((int)MyEnum2.Dodo);
并使用第一个构造函数:

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

另一种选择是:

public MyObject(Enum someEnum){
    ID = Convert.ToInt32(someEnum);
}
这样,您就可以按要求使用它,而不必每次调用contstructor时都强制转换为
int

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

只需使用通用构造函数:

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);
    }
}
类MyObject{
公共MyObject(T someEnum),其中T:struct,IConvertible
{
if(!typeof(T).IsEnum)
抛出新ArgumentException(“非枚举”);
ID=Convert.ToInt32(someEnum);
}
}
现在您可以很容易地这样称呼它:

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

但更简单的方法是将枚举作为整数传递给构造函数,如其他答案中所述。

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

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

试试看。我希望它有用。

好吧,如果您真的需要将此调用设置为多种类型的通用调用,那么您应该如何使用:

  • 检查您的参数是否真的是
    枚举
  • 了解你的论点所基于的类型(不一定是
    Int32
  • 现在投射你的物体

    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!");
        }
    }
    
    public static Int32 getanit(T arg),其中T:struct
    {
    if((T.IsEnum的类型))
    {
    var underyingtype=typeof(T).getEnumUnderlyngType();
    if(underlyngtype==typeof(Int32)
    ||underlyngType==typeof(Int16))//等。
    {
    尝试
    {
    动态值=arg;
    var result=(Int32)value;//可以抛出InvalidCast!
    返回结果;
    }
    抓住
    {
    投掷;
    }
    }
    其他的
    {
    抛出新的InvalidCastException(“基础类型
    当然不能对Int32进行浇注!”;
    }
    }
    其他的
    {
    抛出新的InvalidCastException(“不是枚举!”);
    }
    }
    
    这样,您就可以实现以下漂亮语法:
    var j=getanit(MyEnum.FirstValue)


  • 您可以以整数形式接收参数,并在传递枚举时将其转换为整数。。最好是编写一个具有泛型子类的非泛型基类,然后将枚举类型作为泛型子类的类型参数。尴尬
    MyBase b=newmysub(EnumA.SomeValue);int n=b.ID
    MyObject(MyEnum1 enum1Selection){}但integer更好
    newmyobject((int)MyEnum1.Something)
    ?upvote@SuperPeanut,但是,我会创建一个“objectType”
    enum
    并将其传递给一个工厂,该工厂反过来使用正确的
    enum
    参数创建正确的对象
    var newObject=myFactory.Create(ObjectType.One)
    。我几乎可以肯定,您可能会添加许多不同的检查,并在几年内完善此代码=),是的,传递整数更容易。它如何准确地回答他的问题?以及从构造函数访问成员属性会得到什么?是的,这是我已经在做的,如果我可以直接传递枚举,那么看起来更可读如果它是关于可读性的,你可以使用@HimBromBeere和泛型构造函数,你必须写两次枚举名,但看起来没问题。。。这一切都取决于您想要什么您知道不能将枚举用作约束吗?如果可以的话,生活会更轻松,但它不会编译。@Ben你是对的,我适当地更新了答案。不幸的是,您失去了针对
    Enum
    的编译器类型检查,这种方法使得
    int
    的实例也可以传递给该方法。我痛苦地意识到这一点。我一整天都在努力寻找一个尽可能可靠的解决方案。但可悲的是,上面的内容和你得到的一样好!