我正在尝试做的是wirte linq表达式,它允许我按Custom属性命令我的List<PropertyInfo>
某个对象,例如:
public class SampleClass{
[CustomAttribute("MyAttrib1",1)]
public string Name{ get; set; }
[CustomAttribute("MyAttrib2",1)]
public string Desc{get;set;}
[CustomAttribute("MyAttrib1",2)]
public int Price{get;set;}
}
CustomAttribute.cs:
public class CustomAttribute: Attribute{
public string AttribName{get;set;}
public int Index{get;set;}
public CustomAttribute(string attribName,int index)
{
AttribName = attribName;
Index = index;
}
}
到目前为止,我能够从名为SampleClass的类中获取所有属性:
List<PropertyInfo> propertiesList = new List<PropertyInfo>((IEnumerable<PropertyInfo>)typeof(SampleClass).GetProperties());
到目前为止,我尝试对此propertiesList
进行排序(btw不起作用):
var sortedPropertys = propertiesList
.OrderByDescending(
(x, y) => ((CustomAttribute) Attribute.GetCustomAttribute((PropertyInfo) x, typeof (CustomAttribute))).AttribName
.CompareTo((((CustomAttribute) Attribute.GetCustomAttribute((PropertyInfo) y, typeof (CustomAttribute))).AttribName ))
).OrderByDescending(
(x,y)=>((CustomAttribute) Attribute.GetCustomAttribute((PropertyInfo) x, typeof (CustomAttribute))).Index
.CompareTo((((CustomAttribute) Attribute.GetCustomAttribute((PropertyInfo) y, typeof (CustomAttribute))).Index)))
.Select(x=>x);
输出列表应该是(我只会用PropertyInfo.Name告诉它):
property name: Name,Price,Desc
我的问题是:可以这样做吗?如果是,我该如何正确地做到这一点?
如果你有一些问题请问(我会尽力回答每一个不确定因素)。我希望对问题的描述就足够了。
感谢您提前:)
答案 0 :(得分:7)
var props = typeof(SampleClass)
.GetProperties()
.OrderBy(p => p.GetCustomAttributes().OfType<CustomAttribute>().First().AttribName)
.ThenBy(p => p.GetCustomAttributes().OfType<CustomAttribute>().First().Index)
.Select(p => p.Name);
var propNames = String.Join(", ", props);
输出:名称,价格,描述
答案 1 :(得分:0)
我正在阅读这篇文章,因为我想查看 xml 属性并遇到错误,因为似乎有了这个答案,我也得到了我不想要的属性。然后我做了一些似乎有效的东西,我对自己说,有一天它可以帮助别人。
IOrderedEnumerable<PropertyInfo> Properties = typeof(FooClass).GetProperties()
.Where(p => p.CustomAttributes.Any(y => y.AttributeType == typeof(XmlElementAttribute)))
.OrderBy(g=> g.GetCustomAttributes(false).OfType<XmlElementAttribute>().First().Order);