2017-10-20 11 views
1

プロパティの属性からデータを抽出するコードを単純化しようとしています。属性の内容extracion

属性:

[AttributeUsage(AttributeTargets.Property)] 
class NameAttribute : Attribute 
{ 
    public string Name { get; } 

    public ColumnAttribute(string name) 
    { 
     Name = name; 
    } 
} 

項目の内容がコード(除去ヌルチェックを)抽出:

public static string GetName<T>(string propName) 
{ 
    var propertyInfo = typeof(T).GetProperty(propName); 
    var nameAttribute = (NameAttribute)propertyInfo.GetCustomAttributes(typeof(NameAttribute)).FirstOrDefault(); 
    return nameAttribute.Name; 
} 

サンプルクラス:

class TestClass 
{ 
    [Column("SomeName")] 
    public object NamedProperty { get; set; } 
} 

コールサンプル:

var name = GetName<TestClass>(nameof(TestClass.NamedProperty)) 

属性の内容の抽出方法を書き換えて呼び出しを簡素化/短縮する方法はありますか。長さのために私には不便です。

CallerMemberNameAttributeのようなものは素晴らしいかもしれませんが、何も見つかりませんでした。

+0

それは私私は – Backs

+0

のために[OK]を探しますそれを文字列に補間するfowの方法、文字列ごとに2..5の呼び出しがありますが、現在の呼び出し構文は長すぎます –

答えて

0

あなたの構文はかなり短いです。唯一の冗長な情報はクラス名ですが、他のすべてはが必要です、それははるかに短い得ることはありません。クラス名の冗長性を削除する場合、以下に示すように、短い構文でコールすることができます。しかし、それはコストがかかり、より複雑な実装になります。それはそれはそれの価値があるかどうかを判断するのはあなた次第です:

namespace ConsoleApp2 
{ 
    using System; 
    using System.Linq.Expressions; 
    using System.Reflection; 

    static class Program 
    { 
     // your old method: 
     public static string GetName<T>(string propName) 
     { 
      var propertyInfo = typeof(T).GetProperty(propName); 

      var nameAttribute = propertyInfo.GetCustomAttribute(typeof(NameAttribute)) as NameAttribute; 

      return nameAttribute.Name; 
     } 

     // new syntax method. Still calls your old method under the hood. 
     public static string GetName<TClass, TProperty>(Expression<Func<TClass, TProperty>> action) 
     { 
      MemberExpression expression = action.Body as MemberExpression; 
      return GetName<TClass>(expression.Member.Name); 
     } 

     static void Main() 
     { 
      // you had to type "TestClass" twice 
      var name = GetName<TestClass>(nameof(TestClass.NamedProperty)); 

      // slightly less intuitive, but no redundant information anymore 
      var name2 = GetName((TestClass x) => x.NamedProperty); 

      Console.WriteLine(name); 
      Console.WriteLine(name2); 
      Console.ReadLine(); 
     } 
    } 

    [AttributeUsage(AttributeTargets.Property)] 
    class NameAttribute : Attribute 
    { 
     public string Name { get; } 

     public NameAttribute(string name) 
     { 
      this.Name = name; 
     } 
    } 

    class TestClass 
    { 
     [Name("SomeName")] 
     public object NamedProperty { get; set; } 
    } 
} 

出力は同じです:

somenameの

somenameの

関連する問題