Tag: 枚举

C#从整数反序列化枚举

是否可以从c#中的int反序列化枚举。 例如,如果我有以下课程: class Employee { public string Name { get; set;} public int EmployeeTypeID { get; set;} } 我可以轻松地从XML创建它 Joe Bloggs 1 使用这样的东西: Employee employee = (Employee)new XmlSerializer(typeof(Employee)).Deserialize(XmlReader); 由于涉及的工作很少,这允许我使用一个通用服务,我可以通过将select命令,连接字符串和类型输入到并检索对象数组而不需要进一步映射来为所有数据库对象使用。 但是我已经忘记了枚举。 假设现在而不是整数EmployeeType是一个枚举: public enum EmployeeTypeEnum { Admin = 1, Sales = 2 } 所以我的class级成了: class Employee { public string Name { get; set;} public EmployeeTypeEnum EmployeeTypeID […]

添加枚举值是否会破坏二进制兼容性?

想象一下DLL中的这个枚举。 public enum Colors { Red, Green } 添加枚举值是否会破坏二进制兼容性? 如果我要改变它,现有的EXE会破裂吗? public enum Colors { Red, Green, Blue } 我看到了这个答案 ,但它似乎解决了插入值的问题。 如果我只在最后添加值,那可以吗?

嵌套枚举和属性命名冲突

这里和这里有一些相关的问题,但它们并没有真正给我满意的答案。 问题是嵌套在C#中的类的枚举不能与该类的属性具有相同的名称。 我的例子: public class Card { public enum Suit { Clubs, Diamonds, Spades, Hearts } public enum Rank { Two, Three, … King, Ace } public Suit Suit { get; private set; } public Rank Rank { get; private set; } … } 有一些选项可以解决这个问题,但它们对我来说似乎并不合适。 我可以在课堂外移动枚举,但是你只会说Suit而不是Card.Suit ,这对我来说似乎不对。 在Card背景之外什么是Suit ? 我可以将它们移到课外,并将它们更改为类似CardSuit和CardRank ,但后来我觉得我正在将上下文信息烘焙到枚举的名称中,当它应该由类或命名空间名称处理时。 我可以将枚举的名称更改为Suits和Ranks ,但这违反了Microsoft的命名准则 。 它感觉不对劲。 […]

枚举为标志使用,设置和移位

我有两面旗帜: [Flags] enum Flags { A = 1, B = 2 }; 我这样设置它们: Mode = Flags.A | Flags.B; // default value for(int i = 0; i < args.Length; i++) { switch(args[i]) { case "–a": { if ((Mode & Flags.A) == Flags.A && (Mode & Flags.B) == Flags.B) // both, default assume { Mode = Flags.A; […]

不使用,foreach或手动调用Dispose()时的枚举器处理

我正在使用yield return迭代SqlDataReader的记录: IEnumerable GetReadings() { using (var connection = new SqlConnection(_connectionString)) { using (var command = new SqlCommand(_query, connection)) { connection.Open(); using (var reader = command.ExecuteReader()) { while (reader.Read()) { yield return new Reading { End = reader.GetDateTime(0), Value = reader.GetDouble(1) }; } } connection.Close(); } } } 然后我使用这个被接受的答案的改编版本来“拉”许多迭代器: var enumerators = data.Select(d => new […]

使用reflection和枚举来进行MVC应用程序访问的逻辑控制是否安全?

试图管理对网站的访问我创建了一些必要的实体 目标是为我的MVC应用程序的某些控制器的操作方法使用自定义权限属性。 [Permissions(PermissionType.SomePermissionName, CrudType.CanDelete)] public ActionResult SomeAction() { } 对于这个操作,我有两个枚举 [Flags] public enum CrudType { CanCreate = 0x1, CanRead = 0x2, CanUpdate = 0x4, CanDelete = 0x8, } [Flags] public enum PermissionType { SomePermissionName = 0x1, //… } 现在我想要下面的方法来检查权限 public static bool CanAccess(RolePermissions rp, CrudType crudType) { var pInfo = rp.GetType().GetProperties(); var res = pInfo.FirstOrDefault(x […]

使用枚举实现层次结构的最佳C#模式是什么?

我正在实现代表距离(或长度)的值类型。 有一个枚举代表不同的度量单位,例如: public enum DistanceUnit { Millimeter, Centimeter, Meter, Kilometer, Inch, Foot, Yard, Mile }; 这些测量属于两个系统之一 – 公制或英制。 由于枚举不支持hierachies,表示这种层次结构的最佳模式是什么? 它是否使用位标志? 或者使用两个单独的枚举以及一些方法来关联它们? 或者声明静态成员而不是枚举? 给我一些建议……你会如何实现这个? 编辑 – 更多说明:我有几个不可变的结构(由T4生成)代表各种测量: public struct Meters : IEquatable, IEquatable, IEquatable, … IComparable etc.. etc.. { public readonly decimal Value; … public static implicit operator Distance (Meters other) { // Can implicitly cast […]

带有标志属性的C#枚举

我想知道带有Flag属性的枚举是否主要用于按位运算,如果枚举值未定义,编译器为什么不自动生成值。 例如。 [标志] public enum MyColor { 黄色= 1, 绿色= 2, 红= 4, 蓝= 8 } 如果未分配值1,2,4,8是自动生成的,那将会很有帮助。 想知道你对此的看法。

.NET枚举类型实际上是可变的值类型吗?

通过反思,在枚举类型的字段中查看,我惊讶地发现,保留枚举的特定实例的实际值的“支持”实例字段不是private ,正如我所想的那样,但是public 。 它也不是readonly 。 ( IsPublic true, IsInitOnly false。) 许多人认为.NET类型系统中的“可变”值类型是“邪恶的”,那么为什么枚举类型 (例如从C#代码创建) 就是这样? 现在,事实certificate,C#编译器有某种神奇的东西否认公共实例字段的存在(但见下文),但在例如PowerShell中你可以这样做: prompt> $d = [DayOfWeek]::Thursday prompt> $d Thursday prompt> $d.value__ = 6 prompt> $d Saturday 字段值value__可以写入。 现在,要在C#中执行此操作,我必须使用dynamic因为看起来使用正常的编译时成员绑定,C#假装public实例字段不存在。 当然要使用dynamic ,我们将不得不使用枚举值的装箱 。 这是一个C#代码示例: // create a single box for all of this example Enum box = DayOfWeek.Thursday; // add box to a hash set […]

Enum拳击和平等

为什么返回False public enum Directions { Up, Down, Left, Right } static void Main(string[] args) { bool matches = IsOneOf(Directions.Right, Directions.Left, Directions.Right); Console.WriteLine(matches); Console.Read(); } public static bool IsOneOf(Enum self, params Enum[] values) { foreach (var value in values) if (self == value) return true; return false; } 而这会返回True吗? public static bool IsOneOf(Enum self, params Enum[] […]