【问题标题】:Set one enum equal to another设置一个枚举等于另一个
【发布时间】:2012-06-05 14:46:05
【问题描述】:

我在 2 个不同的对象中有 2 个枚举。我想将对象#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 中的枚举?谢谢

【问题讨论】:

  • 为什么首先有两个具有相同值的枚举?删除一个的定义,并在使用它的任何地方用另一个替换它。

标签: c# .net enums


【解决方案1】:

假设您保持它们相同,您可以转换为/从 int:

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

【讨论】:

    【解决方案2】:

    枚举具有底层整数类型,默认为 int (System.Int32),但您也可以使用“enum MyEnum : type”显式指定它。

    因为您在两个不同的命名空间中工作,所以 Enum 类型本质上是不同的,但由于它们的基础类型相同,您可以直接转换它们:

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

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

    【讨论】:

    • 嘿,我不知道你可以像这样直接投射枚举。我总是转换为/从他们的基本类型转换!每天学些新东西。 :) +1
    • 我必须说我也不确定,但你刚刚确认了。 :D
    • 我也不确定,所以我不得不编写一个快速脚本并检查值。 :P
    【解决方案3】:

    最好的方法是使用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; 
    

    【讨论】:

    • 这里的底层类型(甚至 Enum 的值)完全相同。这种方法在大型项目中会造成很大的性能损失。 (获取类型、转换、转换为字符串并解析)
    • @lesderid - 但我认为最好先检查......如果要求像你说的那样,我已经添加了其他方式......
    • 我指的是“最安全的方式”。铸造时永远不会有问题,只有值可以是意想不到的。这就是为什么在这种情况下,你不应该首先投射枚举,应该只有一个枚举,而不是两个具有完全相同的成员。
    • 如果您无法控制枚举或不确定它们是否会被维护(或者您有一些可转换的值而有些不能),这当然是一种安全的方法。但除此之外,如果你确实有控制权,你也可以编写一个快速的单元测试,以确保你在两个枚举中保持相同的值,并获得直接转换的性能/简单性提升。
    猜你喜欢
    • 2014-10-09
    • 2016-11-30
    • 1970-01-01
    • 2014-08-26
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    相关资源
    最近更新 更多