使用EnumMemberAttribute和自动做字符串转换 [英] Using EnumMemberAttribute and doing automatic string conversions

查看:323
本文介绍了使用EnumMemberAttribute和自动做字符串转换的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下代码



  [DataContract] 
公共枚举StatusType
{
〔EnumMember(VALUE =A)
所有,
[EnumMember(VALUE =I)]
进程内,
[EnumMember(VALUE =C) ]
齐全,
}

我要做到以下几点:

 变种s =C; 
StatusType状态= SerializerHelper.ToEnum< StatusType>(S); //现在状态StatusType.Complete
串newString = SerializerHelper.ToEnumString< StatusType>(状态); // newString现在是C



我做了使用的DataContractSerializer(请参见下面的代码的第二部分),但似乎很多工作。



我失去了一些东西明显?想法?谢谢



 公共静态字符串ToEnumString< T>(T型)
{
字符串s;
使用(VAR毫秒=新的MemoryStream())
{
变种SER =新的DataContractSerializer(typeof运算(T));
ser.WriteObject(MS,类型);
ms.Position = 0;
变种SR =新的StreamReader(毫秒);
S = sr.ReadToEnd();使用
}
(VAR XML =新的XmlTextReader(S,XmlNodeType.Element,NULL))
{
xml.MoveToContent();
xml.Read();
返回xml.Value;
}
}


解决方案

下面是我的主张 - 它应该给你如何做到这一点(检查还获取属性枚举的想法值):

 公共静态字符串ToEnumString< T>(T型)
{
VAR enumType = typeof运算(T);
变种名称= Enum.GetName(enumType,类型);
VAR enumMemberAttribute =((EnumMemberAttribute [])enumType.GetField(名称).GetCustomAttributes(typeof运算(EnumMemberAttribute),真))单();
返回enumMemberAttribute.Value;
}

公共静态牛逼ToEnum< T>(字符串str)
{
VAR enumType = typeof运算(T);
的foreach(在Enum.GetNames(enumType VAR名))
{
VAR enumMemberAttribute =((EnumMemberAttribute [])enumType.GetField(名称).GetCustomAttributes(typeof运算(EnumMemberAttribute),真) )。单();
如果(enumMemberAttribute.Value == STR)回报(T)Enum.Parse(enumType,名);
}
//抛出异常或处理任何你想要或
返回默认值(T);
}


I have the following code

[DataContract]
public enum StatusType
{
    [EnumMember(Value = "A")]
    All,
    [EnumMember(Value = "I")]
    InProcess,
    [EnumMember(Value = "C")]
    Complete,
}

I'd like to do the following:

 var s = "C";
 StatusType status = SerializerHelper.ToEnum<StatusType>(s);   //status is now StatusType.Complete
 string newString = SerializerHelper.ToEnumString<StatusType>(status);   //newString is now "C"

I've done the second part using DataContractSerializer (see code below), but it seems like a lot of work.

Am I missing something obvious? Ideas? Thanks.

    public static string ToEnumString<T>(T type)
    {
        string s;
        using (var ms = new MemoryStream())
        {
            var ser = new DataContractSerializer(typeof(T));
            ser.WriteObject(ms, type);
            ms.Position = 0;
            var sr = new StreamReader(ms);
            s = sr.ReadToEnd();
        }
        using (var xml = new XmlTextReader(s, XmlNodeType.Element, null))
        {
            xml.MoveToContent();
            xml.Read();
            return xml.Value;
        }
    }

解决方案

Here is my proposition - it should give you the idea on how to do this (check also Getting attributes of Enum's value):

public static string ToEnumString<T>(T type)
{
    var enumType = typeof (T);
    var name = Enum.GetName(enumType, type);
    var enumMemberAttribute = ((EnumMemberAttribute[])enumType.GetField(name).GetCustomAttributes(typeof(EnumMemberAttribute), true)).Single();
    return enumMemberAttribute.Value;
}

public static T ToEnum<T>(string str)
{
    var enumType = typeof(T);
    foreach (var name in Enum.GetNames(enumType))
    {
        var enumMemberAttribute = ((EnumMemberAttribute[])enumType.GetField(name).GetCustomAttributes(typeof(EnumMemberAttribute), true)).Single();
        if (enumMemberAttribute.Value == str) return (T)Enum.Parse(enumType, name);
    }
    //throw exception or whatever handling you want or
    return default(T);
}

这篇关于使用EnumMemberAttribute和自动做字符串转换的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆