0

渡されたコードがenumのいずれかに存在するかどうかをEnumでチェックインしたい。問題は、コード属性を使用して定義された列挙型が以下のようになっていることです。

public enum TestEnum
    {

        None,

        [Code("FMNG")]
        FunctionsManagement,

        [Code("INST_MAST_MGT")]
        MasterInstManagement
}

[AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
    public class CodeAttribute : Attribute
    {
        readonly string _code;
        public string Code
        {
            get
            {
                return _code;
            }
        }
        public CodeAttribute(string code)
        {
            _code = code;
        }
    }

これで、使用可能な文字列 (例: "FMNG") があり、enum 属性にある渡された文字列で列挙型が存在することを検索したいと考えています。

文字列を使用または渡すことで、その列挙型を確認/取得するにはどうすればよいですか? 使用してみましEnum.IsDefined(typeof(ActivityEnum), "FMNG")たが、列挙型の属性では機能しません。

4

5 に答える 5

1

属性を完全に廃止して、コードの静的辞書を作成することも考えられます。

static Dictionary<string, TestEnum> codeLookup = new Dictionary<string, TestEnum>() { 
                                                     { "FMNG" , TestEnum.FunctionsManagement }, 
                                                     { "INST_MAST_MGT", TestEnum.MasterInsManagement } };

それからただする

bool isDefined = codeLookup.ContainsKey("FMNG");

これは、毎回リフレクションを使用して属性をループするよりも高速かもしれませんが、必要に応じて異なります

于 2013-05-21T11:16:14.970 に答える
0
public TestEnum GetEnumByAttributeName(string attributeName)
{
    foreach (var item in Enum.GetNames(typeof(TestEnum)))
    {
        var memInfo = typeof(TestEnum).GetMember(item);
        var attributes = memInfo[0].GetCustomAttributes(typeof(CodeAttribute), false);
        if (attributes.Count()> 0 && ((CodeAttribute)attributes[0]).Code == attributeName)
            return (TestEnum)Enum.Parse(typeof(TestEnum), item);
    }
    return TestEnum.None;
}
于 2013-05-21T10:44:38.950 に答える
0

この方法を使用できます:

public static T GetEnumValueByAttributeString<T>(string code) where T : struct
{
  if (!typeof(T).IsEnum)
    throw new ArgumentException("T should be an enum");

  var matches = typeof(T).GetFields().Where(f =>
    ((CodeAttribute[])(f.GetCustomAttributes(typeof(CodeAttribute), false))).Any(c => c.Code == code)
    ).ToList();

  if (matches.Count < 1)
    throw new Exception("No match");
  if (matches.Count > 1)
    throw new Exception("More than one match");

  return (T)(matches[0].GetValue(null));
}

ご覧のとおり、付属の文字列があいまいであるかどうかをチェックします。次のように使用します。

var testEnum = GetEnumValueByAttributeString<TestEnum>("FMNG");

パフォーマンスが問題になる場合は、Dictionary<string, T>すばやく検索できるように、すべての「翻訳」を初期化して保持することをお勧めします。

于 2013-05-21T11:26:24.520 に答える
0

以下の一般的な方法を見つけました:

public static T GetEnumValueFromDescription<T>(string description)
        {
            var type = typeof(T);
            if (!type.IsEnum)
                throw new ArgumentException();

            FieldInfo[] fields = type.GetFields();
            var field = fields.SelectMany(f => f.GetCustomAttributes(
                                typeof(CodeAttribute), false), (
                                    f, a) => new { Field = f, Att = a })
                            .Where(a => ((CodeAttribute)a.Att)
                                .Code == description).SingleOrDefault();
            return field == null ? default(T) : (T)field.Field.GetRawConstantValue();
        }

ソース: Description 属性から Enum を取得

于 2013-05-21T11:54:27.577 に答える