所以我有一个来自类的Properties集合,我想循环通过它。对于每个属性,我可能都有自定义属性,所以我想循环使用这些属性。在这种特殊的情况下,我在我的城市类上有一个自定义属性,如
public class City
{
[ColumnName("OtroID")]
public int CityID { get; set; }
[Required(ErrorMessage = "Please Specify a City Name")]
public string CityName { get; set; }
}
属性被定义为这样的
[AttributeUsage(AttributeTargets.All)]
public class ColumnName : System.Attribute
{
public readonly string ColumnMapName;
public ColumnName(string _ColumnName)
{
this.ColumnMapName= _ColumnName;
}
}
当我尝试循环遍历属性[这很好],然后循环遍历属性时,它只会忽略该属性的for循环,并且不返回任何内容。
foreach (PropertyInfo Property in PropCollection)
//Loop through the collection of properties
//This is important as this is how we match columns and Properties
{
System.Attribute[] attrs =
System.Attribute.GetCustomAttributes(typeof(T));
foreach (System.Attribute attr in attrs)
{
if (attr is ColumnName)
{
ColumnName a = (ColumnName)attr;
var x = string.Format("{1} Maps to {0}",
Property.Name, a.ColumnMapName);
}
}
}
当我转到具有自定义属性的属性的即时窗口时,我可以进行
?Property.GetCustomAttributes(true)[0]
它将返回ColumnMapName: "OtroID"
虽然
我相信你想这样做:
PropertyInfo[] propCollection = type.GetProperties();
foreach (PropertyInfo property in propCollection)
{
foreach (var attribute in property.GetCustomAttributes(true))
{
if (attribute is ColumnName)
{
}
}
}
根据作者的要求,从原始问题的评论中回复
只是出于兴趣,(T)的类型中的T是什么?
在即时窗口中,您正在调用Property.GetCustomAttribute(true)[0],但在foreach循环中,您却在类型参数上调用GetCustomattributes。
此行:
System.Attribute[] attrs = System.Attribute.GetCustomAttributes(typeof(T));
应该是这个
System.Attribute[] attrs = property.GetCustomAttributes(true);
致问候,
我得到这段代码的结果是x
的值为"OtroID Maps to CityID"
。
var props = typeof(City).GetProperties();
foreach (var prop in props)
{
var attributes = Attribute.GetCustomAttributes(prop);
foreach (var attribute in attributes)
{
if (attribute is ColumnName)
{
ColumnName a = (ColumnName)attribute;
var x = string.Format("{1} Maps to {0}",prop.Name,a.ColumnMapName);
}
}
}
在内部外观中,您应该调查Properties,而不是(T)的类型。
使用intellisense并查看可以调用Property对象的方法。
Property.GetCustomAttributes(布尔值)可能对您很重要。这将返回一个数组,您可以在它上使用LINQ快速返回符合您需求的所有属性。