私は、次の注釈を持っている: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;
}
}
}
}
ありがとう、あなたは私の一日を作った!魔法は.Nameの代わりにGetName()を使用することでした。 –
ようこそ。 'GetName()'は魔法です;-) – CodeNotFound