📜  C# 通过反射与属性设置属性值 - C# (1)

📅  最后修改于: 2023-12-03 14:39:48.129000             🧑  作者: Mango

C# 通过反射与属性设置属性值

在 C# 中,我们可以使用反射机制(Reflection)来获取和设置对象的属性值。反射机制可以帮助我们在编译时获取类型的信息,而不需要在运行时提前知道类型的具体信息。这对于开发大型、动态的系统非常有用。

反射机制

反射机制是指通过程序运行时获取程序的元数据(metadata)和类型信息。C# 中的反射机制主要通过 System.Reflection 命名空间下的类型来实现,如 AssemblyType 等。

以下是获取对象类型的代码示例:

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; }
}

我们在 NameAge 属性上分别添加了 DisplayName 特性,用于描述属性的中文名称。

我们可以通过 Attribute.GetCustomAttribute 方法来获取属性特性:

DisplayNameAttribute attribute = (DisplayNameAttribute)Attribute.GetCustomAttribute(propertyInfo, typeof(DisplayNameAttribute));
string displayName = (attribute == null) ? name : attribute.DisplayName;
总结

通过反射和属性,我们可以动态地获取和修改对象的属性值,以及使用属性特性来描述和注解属性。使用反射机制需要注意性能和安全问题,应当谨慎使用。