2017-10-20 33 views
1

J'essaie de simplifier le code pour extraire des données de l'attribut de propriété.Contenu de l'attribut extracion

Attribut:

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

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

attribut contenu du code d'extraction (null contrôles supprimés):

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

classe de l'échantillon:

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

Appel échantillon:

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

Est-ce un moyen de réécrire la méthode d'extraction de contenu d'attribut pour simplifier/raccourcir son appel. C'est trop gênant pour moi à cause de sa longueur.

Quelque chose comme CallerMemberNameAttribute serait génial mais je n'ai rien trouvé.

+0

Il semble ok pour moi – Backs

+0

je suis 2.5 appels par chaîne, mais la syntaxe d'appel actuelle est trop longue pour cela –

Répondre

0

Votre syntaxe est déjà assez courte. La seule information redondante est le nom de la classe, tout le reste est nécessaire, il ne sera pas beaucoup plus court. Vous pourriez avoir une syntaxe plus courte dans votre appel comme démontré ci-dessous, où vous supprimez la redondance du nom de classe. Cependant, cela se fait au prix d'une mise en œuvre plus complexe. Il est à vous de décider si cela vaut le coup:

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; } 
    } 
} 

La sortie est le même:

UnNom

UnNom