C#从属性中自定义属性



所以我有一个来自类的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快速返回符合您需求的所有属性。

相关内容

  • 没有找到相关文章

最新更新