一尘不染

反射-获取属性的名称和值

c#

我有一个类,可以使用名为Name的属性将其命名为Book。有了该属性,我就有了与之关联的属性。

public class Book
{
    [Author("AuthorName")]
    public string Name
    {
        get; private set; 
    }
}

在我的主要方法中,我正在使用反射,并希望为每个属性获取每个属性的键值对。因此,在此示例中,我希望属性名称显示为“ Author”,属性值显示为“
AuthorName”。

问题:如何使用反射获得属性名称和属性值?


阅读 465

收藏
2020-05-19

共1个答案

一尘不染

使用typeof(Book).GetProperties()获得的阵列PropertyInfo实例。然后GetCustomAttributes()对每个对象使用,PropertyInfo以查看它们是否具有AuthorAttribute类型。如果这样做,则可以从属性信息中获取属性的名称,并从属性中获取属性值。

沿着这些思路进行一些操作,以扫描类型以查找具有特定属性类型的属性,并在字典中返回数据(请注意,可以通过将类型传递给例程来使其更加动态):

public static Dictionary<string, string> GetAuthors()
{
    Dictionary<string, string> _dict = new Dictionary<string, string>();

    PropertyInfo[] props = typeof(Book).GetProperties();
    foreach (PropertyInfo prop in props)
    {
        object[] attrs = prop.GetCustomAttributes(true);
        foreach (object attr in attrs)
        {
            AuthorAttribute authAttr = attr as AuthorAttribute;
            if (authAttr != null)
            {
                string propName = prop.Name;
                string auth = authAttr.Name;

                _dict.Add(propName, auth);
            }
        }
    }

    return _dict;
}
2020-05-19