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

27 浏览
0 Comments

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

我有一个类,我们称之为Book,它有一个名为Name的属性。在该属性上,我有一个相关联的属性。

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

在我的主方法中,我正在使用反射,并希望获取每个属性的每个属性的键值对。因此,在这个例子中,我期望看到属性名为"Author",属性值为"AuthorName"。

问题:如何使用反射在我的属性上获取属性名和属性值?

0
0 Comments

问题的出现原因是希望通过反射获取属性的名称和值,并将其存储在一个字典中。解决方法是使用C#的反射机制来实现这个目标。

在给定的代码中,首先使用typeof(Book)来获取Book类的类型。然后使用GetProperty("Name")来获取属性名称为"Name"的属性。接下来使用GetCustomAttributes(false)来获取该属性的所有自定义属性,并将其存储在一个数组中。

如果想要包括继承的属性,可以将false更改为true。最后,通过使用ToDictionary方法将属性的名称和值存储在一个字典中。

如果只需要获取Author属性,并且想要跳过将来的类型转换,可以将.OfType<AuthorAttribute>()添加到表达式中。

但是,当同一个属性上存在两个相同类型的属性时,以上代码会抛出异常。

0
0 Comments

文章标题:反射 - 获取属性的名称和值

在使用反射获取属性的名称和值时,可以使用typeof(Book).GetProperties()来获取一个PropertyInfo实例的数组。然后,在每个PropertyInfo上使用GetCustomAttributes()来查看它们是否具有Author属性类型。如果有,可以从属性信息中获取属性的名称,并从属性中获取属性值。

以下是一个用于扫描具有特定属性类型的属性并在字典中返回数据的示例代码(注意,通过将类型传递给例程,可以使其更加灵活):

public static Dictionary GetAuthors()
{
    Dictionary _dict = new Dictionary();
    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;
}

有人希望不必进行属性强制转换。

prop.GetCustomAttributes(true)只返回一个object[]。如果不想进行强制转换,可以在属性实例上使用反射。

这里的AuthorAttribute是什么?它是从Attribute派生的类吗?

是的。OP使用了一个名为'Author'的自定义属性。可以在这里找到一个示例:[msdn.microsoft.com/en-us/library/sw480ze8.aspx](http://msdn.microsoft.com/en-us/library/sw480ze8.aspx)

与其他操作相比(除了空检查和字符串赋值),强制转换属性的性能损耗非常微不足道。

0
0 Comments

问题的出现原因是需要获取属性的名称和值,特别是想要获取特定属性的值,如Display Attribute。解决方法是使用反射来获取属性的名称和值。

在这个例子中,我们想要获取Book类中属性"Name"的Display Attribute的值。下面是解决这个问题的代码:

var pInfo = typeof(Book).GetProperty("Name")
                       .GetCustomAttribute();
var name = pInfo.Name;

通过使用反射,我们首先使用typeof关键字获取Book类的类型。然后使用GetProperty方法获取属性"Name"的信息。接下来,我们使用GetCustomAttribute方法来获取指定属性上的Display Attribute实例。最后,我们可以通过访问pInfo的Name属性来获取Display Attribute的值。

这段代码可以帮助我们在运行时动态地获取属性的名称和值,特别是在需要获取特定属性的值时非常有用。反射提供了一种强大的工具来检查和操作程序的元数据,使我们能够更加灵活地处理属性和其他成员。

0