📅  最后修改于: 2023-12-03 14:39:48.129000             🧑  作者: Mango
在 C# 中,我们可以使用反射机制(Reflection)来获取和设置对象的属性值。反射机制可以帮助我们在编译时获取类型的信息,而不需要在运行时提前知道类型的具体信息。这对于开发大型、动态的系统非常有用。
反射机制是指通过程序运行时获取程序的元数据(metadata)和类型信息。C# 中的反射机制主要通过 System.Reflection
命名空间下的类型来实现,如 Assembly
、Type
等。
以下是获取对象类型的代码示例:
object obj = new Person();
Type type = obj.GetType();
我们还可以使用 typeof
关键字来获取类型信息:
Type type = typeof(Person);
如果我们想获取对象的属性值,可以使用 GetProperty
方法来获取属性信息,然后使用 GetValue
方法获取属性值:
Person person = new Person() { Name = "Tom", Age = 18 };
PropertyInfo propertyInfo = person.GetType().GetProperty("Name");
string name = (string)propertyInfo.GetValue(person);
如果我们想修改属性值,可以使用 SetValue
方法来设置属性值:
propertyInfo.SetValue(person, "Jerry");
如果属性是只读的,我们可以通过以下代码来修改属性值:
FieldInfo fieldInfo = person.GetType().GetField("<Name>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance);
fieldInfo.SetValue(person, "Jerry");
其中 <Name>k__BackingField
是编译器自动生成的字段名。
我们可以使用属性特性(Attribute)来对属性进行注解和描述。以下是一个使用了属性特性的示例:
public class Person
{
[DisplayName("姓名")]
public string Name { get; set; }
[DisplayName("年龄")]
public int Age { get; set; }
}
我们在 Name
和 Age
属性上分别添加了 DisplayName
特性,用于描述属性的中文名称。
我们可以通过 Attribute.GetCustomAttribute
方法来获取属性特性:
DisplayNameAttribute attribute = (DisplayNameAttribute)Attribute.GetCustomAttribute(propertyInfo, typeof(DisplayNameAttribute));
string displayName = (attribute == null) ? name : attribute.DisplayName;
通过反射和属性,我们可以动态地获取和修改对象的属性值,以及使用属性特性来描述和注解属性。使用反射机制需要注意性能和安全问题,应当谨慎使用。