2017-05-07 9 views
2

私は、次の注釈を持っている:EntityFrameworkでは、外部キー列のDisplayNameにアクセスする方法は?

[Display(Name = "NotImportant", ResourceType = typeof(MyResxFile))] 
    public int? PhoneModel { get; set; } // this is the id 
    [Display(Name = "Important", ResourceType = typeof(MyResxFile))] 
    public virtual PhoneModel PhoneModel1 { get; set; } // this is the object 

私は、表示名を取得するには、次のメソッドを使用します。

PropertyInfo pi = SomeObject.GetProperties[0]; // short example 
    columnName = ReflectionExtensions.GetDisplayName(pi); 

それは以外のすべての列のためのコードはのためのカスタム/表示属性を見つけていない作品明らかに1つの属性があっても、PhoneModel1などの列。それはintで動作しますか?しかし、idのヘッダーは必要ありません。PhoneModel1にある実際の値のヘッダーが必要です。

public static class ReflectionExtensions 
    { 

     public static T GetAttribute<T>(this MemberInfo member, bool isRequired) 
      where T : Attribute 
     { 
      var attribute = member.GetCustomAttributes(typeof(T), false).SingleOrDefault(); 

      if (attribute == null && isRequired) 
      { 
       throw new ArgumentException(
        string.Format(
         CultureInfo.InvariantCulture, 
         "The {0} attribute must be defined on member {1}", 
         typeof(T).Name, 
         member.Name)); 
      } 

      return (T)attribute; 
     } 

     public static string GetDisplayName(PropertyInfo memberInfo) 
     { 
      var displayAttribute = memberInfo.GetAttribute<DisplayAttribute>(false); 

      if (displayAttribute != null) 
      { 
       ResourceManager resourceManager = new ResourceManager(displayAttribute.ResourceType); 
       var entry = resourceManager.GetResourceSet(Thread.CurrentThread.CurrentUICulture, true, true) 
              .OfType<DictionaryEntry>() 
              .FirstOrDefault(p => p.Key.ToString() == displayAttribute.Name); 

       return entry.Value.ToString(); 
      } 
      else 
      { 
       var displayNameAttribute = memberInfo.GetAttribute<DisplayNameAttribute>(false); 
       if (displayNameAttribute != null) 
       { 
        return displayNameAttribute.DisplayName; 
       } 
       else 
       { 
        return memberInfo.Name; 
       } 
      } 
     } 
    } 

答えて

2

あなたGetDisplayName拡張メソッドは次のようになります。

public static string GetDisplayName(this PropertyInfo pi) 
{ 
    if (pi == null) 
    { 
     throw new ArgumentNullException(nameof(pi)); 
    } 
    return pi.IsDefined(typeof(DisplayAttribute)) ? pi.GetCustomAttribute<DisplayAttribute>().GetName() : pi.Name; 
} 

そして、それを使用する:

PropertyInfo pi = SomeObject.GetProperties[0]; 
string columnName = pi.GetDisplayName(); 

注プロパティはDisplayName属性を定義していない場合、我々は、プロパティ名を返すこと。

+0

ありがとう、あなたは私の一日を作った!魔法は.Nameの代わりにGetName()を使用することでした。 –

+0

ようこそ。 'GetName()'は魔法です;-) – CodeNotFound

0

これを試してみてください:

var attribute =typeof(MyClass).GetProperty("Name").GetCustomAttributes(typeof(DisplayNameAttribute), true).Cast<DisplayNameAttribute>().Single(); 
string displayName = attribute.DisplayName; 

うまくいけば、それはあなたのためのヘルプです。

関連する問題