可能重复:
获取Enum值的属性
我有一个带有Description属性的枚举,如下所示:
public enum MyEnum
{
Name1 = 1,
[Description("Here is another")]
HereIsAnother = 2,
[Description("Last one")]
LastOne = 3
}
Run Code Online (Sandbox Code Playgroud)
我找到了一些用于根据Enum检索描述的代码
public static string GetEnumDescription(Enum value)
{
FieldInfo fi = value.GetType().GetField(value.ToString());
DescriptionAttribute[] attributes = fi.GetCustomAttributes(typeof(DescriptionAttribute), false) as DescriptionAttribute[];
if (attributes != null && attributes.Any())
{
return attributes.First().Description;
}
return value.ToString();
}
Run Code Online (Sandbox Code Playgroud)
这允许我编写如下代码:
var myEnumDescriptions = from MyEnum n in Enum.GetValues(typeof(MyEnum))
select new { ID = (int)n, Name = Enumerations.GetEnumDescription(n) };
Run Code Online (Sandbox Code Playgroud)
我想要做的是,如果我知道枚举值(例如1) - 我该如何检索描述?换句话说,如何将整数转换为"枚举值"以传递给我的GetDescription方法?
我知道以下是不可能的,因为它必须是一个int
enum GroupTypes
{
TheGroup = "OEM",
TheOtherGroup = "CMB"
}
Run Code Online (Sandbox Code Playgroud)
从我的数据库中我得到一个包含不全面代码的字段(OEM和CMB).我想把这个领域变成一个枚举或其他可以理解的东西.因为目标是可读性,所以解决方案应该简洁.
我还有其他选择吗?
我的枚举包含以下值:
private enum PublishStatusses{
NotCompleted,
Completed,
Error
};
Run Code Online (Sandbox Code Playgroud)
我希望能够以用户友好的方式输出这些值.
我不需要能够再次从字符串变为值.
.Net 4(或任何先前版本)是否基于字符串对较长的switch语句执行任何类型的优化?
我正在解决潜在的性能瓶颈,因为一些长的switch语句在这些情况下寻找匹配的字符串,我一直认为这些是在线性时间内搜索的(或接近线性的,即不使用索引来快速找到匹配串).但这似乎是.Net可以优化的一个显而易见的领域,所以我想我会检查是否是这种情况.
这是我最近的一个衍生问题:索引切换语句,或同等的?.net,C#
我有一个包含以下内容的枚举(例如):
在我的代码中,我使用Country.UnitedKingdom,但是如果我将它分配给字符串,我希望将值设置为UK.
这可能吗?
这可能看起来有点颠倒,但我想要做的是通过其Description属性从枚举中获取枚举值.
所以,如果我有一个枚举声明如下:
enum Testing
{
[Description("David Gouge")]
Dave = 1,
[Description("Peter Gouge")]
Pete = 2,
[Description("Marie Gouge")]
Ree = 3
}
Run Code Online (Sandbox Code Playgroud)
我希望能够通过提供字符串"Peter Gouge"来获得2.
作为起点,我可以遍历枚举字段并使用正确的属性获取字段:
string descriptionToMatch = "Peter Gouge";
FieldInfo[] fields = typeof(Testing).GetFields();
foreach (FieldInfo field in fields)
{
if (field.GetCustomAttributes(typeof(DescriptionAttribute), false).Count() > 0)
{
if (((DescriptionAttribute)field.GetCustomAttributes(typeof(DescriptionAttribute), false)[0]).Description == descriptionToMatch)
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是那时候我仍然坚持在内心做什么.也不确定这是否是第一个出路.
如何使用枚举实现以下功能.NET?我想对每个包含空格的值进行描述.
public enum PersonGender
{
Unknown = 0,
Male = 1,
Female = 2,
Intersex = 3,
Indeterminate = 3,
Non Stated = 9,
Inadequately Described = 9
}
Run Code Online (Sandbox Code Playgroud)
我希望能够在每次使用此类型的值时选择是使用描述还是整数.
有没有办法在C#枚举常量中放置空格?我已经读过你可以通过这样做在VB中做到这一点:
Public Enum EnumWithSpaces
ConstantWithoutSpaces
[Constant With Spaces]
End Enum
Run Code Online (Sandbox Code Playgroud)
...然后像这样访问它:
Public Sub UsingEnumWithSpaces()
Dim foo As EnumWithSpaces = EnumWithSpaces.[Constant With Spaces]
End Sub
Run Code Online (Sandbox Code Playgroud)
这意味着CLR可以处理带空格的枚举.
有没有办法在C#中做到这一点?
是否有任何方式可以在名称中使用带有连字符" - "的枚举条目,例如:
enum myEnum
{
ok,
not-ok,
}
Run Code Online (Sandbox Code Playgroud)
我已经看到了关于enums有友好名字的问题,但如果我可以直接使用连字符,它会省去一些工作.
更新:我想使用连字符的原因是它可以很容易地使用枚举来设置我无法控制的设置值列表,例如:
rejected
replaced
local-bye
remote-bye
Run Code Online (Sandbox Code Playgroud) 当反序列化用EnumMemberAttribute修饰的带有包含空格的值的标记枚举时,将抛出SerializationException.值中的空格被视为分隔符.
有没有办法更改分隔符或将值放在引号中?或者是否有更简单的解决方案?
我正在考虑的选项是:
但我真的觉得这应该是可配置的东西或其他人已经解决的东西.但我找不到任何东西.
我把问题归结为一个简单的单元测试.以下代码导致:
消息=无效的枚举值' Test '无法反序列化为'UnitTests.TestEnum'类型.确保存在必要的枚举值,并且如果类型具有DataContractAttribute属性,则使用EnumMemberAttribute属性标记.来源= System.Runtime.Serialization
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Xml;
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace UnitTests
{
[TestClass]
public class EnumSerizalizationTests
{
[TestMethod]
public void SerializingAndDesrializingAFlaggedEnumShouldResultInSameEnumValues()
{
//Arrange
var orgObject = new TestClass { Value = TestEnum.TestValue1 | TestEnum.TestValue2 };
//Act
var temp = DataContractSerializeObject(orgObject);
var newObject = DataContractDeSerializeObject<TestClass>(temp);
//Assert
newObject.ShouldBeEquivalentTo(orgObject, "Roundtripping serialization should result in same value");
}
public string DataContractSerializeObject<T>(T objectToSerialize)
{
using (var output = new StringWriter()) …Run Code Online (Sandbox Code Playgroud)