反射 - 获取属性的名称和值
问题的出现原因是希望通过反射获取属性的名称和值,并将其存储在一个字典中。解决方法是使用C#的反射机制来实现这个目标。
在给定的代码中,首先使用typeof(Book)
来获取Book类的类型。然后使用GetProperty("Name")
来获取属性名称为"Name"的属性。接下来使用GetCustomAttributes(false)
来获取该属性的所有自定义属性,并将其存储在一个数组中。
如果想要包括继承的属性,可以将false
更改为true
。最后,通过使用ToDictionary
方法将属性的名称和值存储在一个字典中。
如果只需要获取Author属性,并且想要跳过将来的类型转换,可以将.OfType<AuthorAttribute>()
添加到表达式中。
但是,当同一个属性上存在两个相同类型的属性时,以上代码会抛出异常。
文章标题:反射 - 获取属性的名称和值
在使用反射获取属性的名称和值时,可以使用typeof(Book).GetProperties()来获取一个PropertyInfo实例的数组。然后,在每个PropertyInfo上使用GetCustomAttributes()来查看它们是否具有Author属性类型。如果有,可以从属性信息中获取属性的名称,并从属性中获取属性值。
以下是一个用于扫描具有特定属性类型的属性并在字典中返回数据的示例代码(注意,通过将类型传递给例程,可以使其更加灵活):
public static DictionaryGetAuthors() { 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)
与其他操作相比(除了空检查和字符串赋值),强制转换属性的性能损耗非常微不足道。
问题的出现原因是需要获取属性的名称和值,特别是想要获取特定属性的值,如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的值。
这段代码可以帮助我们在运行时动态地获取属性的名称和值,特别是在需要获取特定属性的值时非常有用。反射提供了一种强大的工具来检查和操作程序的元数据,使我们能够更加灵活地处理属性和其他成员。