来自属性的C#自定义属性

Jor*_*dan 5 c# asp.net reflection custom-attributes

所以我有一个我想要循环的类的属性集合.对于每个属性,我可能有自定义属性,所以我想循环这些属性.在这种特殊情况下,我在City Class上有一个自定义属性

public class City
{   
    [ColumnName("OtroID")]
    public int CityID { get; set; }
    [Required(ErrorMessage = "Please Specify a City Name")]
    public string CityName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

该属性定义如此

[AttributeUsage(AttributeTargets.All)]
public class ColumnName : System.Attribute
{
    public readonly string ColumnMapName;
    public ColumnName(string _ColumnName)
    {
        this.ColumnMapName= _ColumnName;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试遍历属性[工作正常]然后循环遍历属性时,它只是忽略属性的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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我转到具有自定义属性的属性的即时窗口时,我可以这样做

?Property.GetCustomAttributes(true)[0]
Run Code Online (Sandbox Code Playgroud)

它会回来 ColumnMapName: "OtroID"

我似乎无法通过编程方式将其用于工作

mse*_*dio 8

我想这样做我相信:

PropertyInfo[] propCollection = type.GetProperties();
foreach (PropertyInfo property in propCollection)
{
    foreach (var attribute in property.GetCustomAttributes(true))
    {
        if (attribute is ColumnName)
        {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Dr.*_*ABT 3

应作者要求,从原始问题的评论中转发

只是出于兴趣 typeof(T) 中的 T 是什么?

在立即窗口中,您正在调用 Property.GetCustomAttribute(true)[0],但在 foreach 循环内,您正在对类型参数调用 GetCustomattributes。

这行:

System.Attribute[] attrs = System.Attribute.GetCustomAttributes(typeof(T));
Run Code Online (Sandbox Code Playgroud)

应该是这个

System.Attribute[] attrs = property.GetCustomAttributes(true);
Run Code Online (Sandbox Code Playgroud)

此致,