现有代码(简化)
我有这个功能
public static string[] GetFieldNames<T>(IEnumerable<T> items)
where T : class
{
var properties = typeof(T).GetProperties().Where(p => SystemTypes.Contains(p.PropertyType)); // Only get System types
return properties.Select(p => p.Name).ToArray();
}
所以如果说我有这个课程
class MyClass {
public string Name { get; set; }
[Description("The value")]
public int Value { get; set; }
}
我可以拥有这样的代码
List<MyClass> items = ...; // Populate items somehow
string[] fieldNames = GetFieldNames(items); // This returns ["Name", "Value"]
工作正常。
问题
我需要获取描述(如果存在),以便GetFieldNames(items)
返回["Name", "The value"]
如何修改GetFieldNames()
函数以读取描述属性(如果存在)?
(请注意,此功能已经简化,实际功能要复杂得多,所以请避免更改逻辑)
答案 0 :(得分:3)
这应该适合你:
return properties.Select(p =>
Attribute.IsDefined(p, typeof(DescriptionAttribute)) ?
(Attribute.GetCustomAttribute(p, typeof(DescriptionAttribute)) as DescriptionAttribute).Description:
p.Name
).ToArray();
答案 1 :(得分:3)
注意:只需添加using System.Reflection
,因为GetCustomAttribute
是.Net 4.5中的扩展方法
public static Tuple<string,string>[] GetFieldNames<T>(IEnumerable<T> items) where T : class
{
var result =
typeof (T).GetProperties()
.Where(p => SystemTypes.Contains(p.PropertyType) &&p.GetCustomAttribute<DescriptionAttribute>() != null)
.Select(
p =>
new Tuple<string, string>(p.Name,
p.GetCustomAttribute<DescriptionAttribute>().Description));
return result.ToArray();
}
对于早期版本的.Net框架,我们可以使用这种扩展方法:
public static class Extension
{
public static T GetCustomAttribute<T>(this System.Reflection.MemberInfo mi) where T : Attribute
{
return mi.GetCustomAttributes(typeof (T),true).FirstOrDefault() as T;
}
}
答案 2 :(得分:1)
这是您可以使用的通用函数,如果fieldName
具有description
标记属性,则返回该值,否则返回null
。
public string GetDescription<T>(string fieldName)
{
string result;
FieldInfo fi = typeof(T).GetField(fieldName.ToString());
if (fi != null)
{
try
{
object[] descriptionAttrs = fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
DescriptionAttribute description = (DescriptionAttribute)descriptionAttrs[0];
result = (description.Description);
}
catch
{
result = null;
}
}
else
{
result = null;
}
return result;
}
示例:
class MyClass {
public string Name { get; set; }
[Description("The age description")]
public int Age { get; set; }
}
string ageDescription = GetDescription<MyClass>("Age");
console.log(ageDescription) // OUTPUT: The age description
答案 3 :(得分:0)
使用GetCustomAttributes方法
static void attributecheck()
{
var props = typeof(Product).GetProperties();
foreach (var propertyInfo in props)
{
var att = propertyInfo.GetCustomAttributes(typeof(DescriptionAttribute), true);
if (att.Length >0)
{
}
}
}
答案 4 :(得分:0)
我经常使用Description
属性,因此我为此写了Nuget。
有了它,您可以致电:
typeof(TestClass).GetPropertyDescription("PropertyName");
它还允许从类,字段,枚举和方法中提取DescriptionAttribute
。