2017-10-20 3 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

나를 좋아 보인다 그것을 문자열로 보간하는 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이

관련 문제