将一个枚举设置为另一个枚举的值

5

我有两个不同对象中的两个枚举。我想将对象#1中的enum设置为对象#2中的enum

这是我的两个对象:

namespace MVC1 {

    public enum MyEnum {
        firstName,
        lastName
      }

   public class Obj1{
        public MyEnum enum1;
    }
   }


     namespace MVC2 {

    public enum MyEnum {
        firstName,
        lastName
      }

    public class Obj2{
        public MyEnum enum1;
      }
    }

我想这样做,但是它无法编译:
 MVC1.Obj1 obj1 = new MVC1.Obj1();
 MVC2.Obj2 obj2 = new MVC2.Obj2();
 obj1.enum1 = obj2.enum1; //I know this won't work.

我该如何将Obj1中的枚举设置为Obj2中的枚举?谢谢。

你为什么一开始就有两个枚举具有相同的值?移除其中一个的定义,并将其在使用的地方替换为另一个。 - Servy
3个回答

7
假设您保持它们不变,您可以将其转换为/从int:
obj1.enum1 = (MVC1.MyEnum)((int)obj2.enum1);

7

枚举类型具有底层整数类型,默认情况下为 int (System.Int32),但您也可以通过使用 "enum MyEnum : type" 明确指定。

由于您正在两个不同的命名空间中工作,因此枚举类型本质上是不同的,但因为它们的底层类型相同,所以您可以进行强制转换:

obj1.enum1 = (MVC1.MyEnum) obj2.enum1;

注意:在C#中,即使没有参数,在函数调用时也必须使用括号。您应该将它们添加到构造函数调用中。


嘿,我不知道你可以直接像那样转换枚举。我一直在将它们转换为/从它们的基本类型!每天都会学到新东西。:) +1 - Chris Sinclair
我必须说我也不确定,但你刚刚证实了它。 :D - lesderid
我也不确定,所以我得写一个快速脚本来检查这个值。 :P - Chris Sinclair

2

最好的方法是使用Enum.IsDefined检查是否在范围内:

int one = (int)obj2.enum1;
if (Enum.IsDefined(typeof(MVC1.MyEnum), one )) { 
  obj1.enum1 = (MVC1.MyEnum)one;
}

 obj1.enum1 = (MVC1.MyEnum) Enum.Parse(typeof(MVC1.MyEnum),
                                 ((int)obj2.enum1).ToString());

或者
int one = (int)obj2.enum1;  
obj1.enum1 = (MVC1.MyEnum)one; 

底层类型(甚至枚举的值)在这里完全相同。这种方法会在大型项目中导致很多性能损失。(获取类型,强制转换,转换为字符串和解析) - lesderid
@lesderid - 但我认为最好先检查一下...如果要求是这样的,我已经添加了另一种方式... - Pranay Rana
我所指的是“最安全的方式”。强制转换时永远不会出现问题,只有值可能是意外的。这就是为什么在像这样的情况下,你不应该首先将枚举强制转换,应该只有一个枚举,而不是两个具有完全相同成员的枚举。 - lesderid
1
如果您无法控制枚举或者不确定它们是否会被维护(或者有一些值可以转换,而另一些则不能),那么这肯定是一种安全的方法。但是,如果您有控制权,最好编写一个快速的单元测试,以确保在两个枚举中保持相同的值,并获得直接转换的性能/简单性提升。 - Chris Sinclair

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接