如何通过反射在C#中按名称获取属性值:完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

如何通过反射在C#中按名称获取属性值:初学者解析

\n\n

想象一下这样的场景:你正在编写代码,需要动态地、在运行时访问对象的属性。这个属性的名称来自配置文件、JSON请求或用户输入。你不能硬编码 object.PropertyName——因为你事先不知道名称。该怎么办?

\n\n

这时就需要用到反射(reflection)——C#中一个强大的机制,允许你在程序运行时检查数据类型及其成员(属性、方法、字段)。本文将解析Stack Overflow上最常见的问题:如何通过包含属性名称的字符串获取对象属性的值。我们将从简单到复杂,结合实际示例进行讲解,并探讨初学者常犯的错误。

\n\n

什么是反射,为什么需要它?

\n\n

C#中的反射是程序“审视自身”并获取关于自身类型信息的能力。System.Reflection命名空间提供了诸如Type、PropertyInfo、MethodInfo等类,允许你:

\n\n
    \n
  • 了解类的所有属性和方法。
  • \n
  • 在不使用 new 运算符的情况下创建类的实例。
  • \n
  • 通过字符串名称调用方法以及获取/设置属性值。
  • \n
\n\n

如果没有反射,你将无法编写通用的对象映射器(如AutoMapper)或能够处理任何数据类型的序列化器。

\n\n

基本示例:按名称获取属性值

\n\n

假设我们有一个简单的类 Person:

\n\n
public class Person\n{\n    public string Name { get; set; }\n    public int Age { get; set; }\n    public string City { get; set; }\n}
\n\n

我们想编写一个方法,该方法接收一个 Person 对象和一个属性名称字符串(例如 "Name" 或 "Age"),并返回该属性的值。以下是使用反射实现的方法:

\n\n
using System;\nusing System.Reflection;\n\npublic static object GetPropertyValue(object obj, string propertyName)\n{\n    if (obj == null) throw new ArgumentNullException(nameof(obj));\n    if (string.IsNullOrEmpty(propertyName)) throw new ArgumentException("属性名称不能为空", nameof(propertyName));\n\n    // 获取对象的类型\n    Type type = obj.GetType();\n\n    // 按名称获取属性信息\n    PropertyInfo propertyInfo = type.GetProperty(propertyName);\n\n    // 检查属性是否存在\n    if (propertyInfo == null)\n        throw new ArgumentException($"在类型 '{type.Name}' 中未找到属性 '{propertyName}'");\n\n    // 获取属性值\n    return propertyInfo.GetValue(obj);\n}
\n\n

现在使用我们的方法:

\n\n
var person = new Person { Name = "安娜", Age = 30, City = "莫斯科" };\n\nstring name = (string)GetPropertyValue(person, "Name");\nint age = (int)GetPropertyValue(person, "Age");\n\nConsole.WriteLine($"姓名: {name}, 年龄: {age}"); // 输出: 姓名: 安娜, 年龄: 30
\n\n

一切正常!关键点:

\n
    \n
  • obj.GetType() — 获取描述对象类型的 Type 对象。
  • \n
  • type.GetProperty("Name") — 查找名为 "Name" 的公共属性。返回 PropertyInfo 或 null(如果未找到属性)。
  • \n
  • propertyInfo.GetValue(obj) — 返回特定实例 obj 的该属性值。
  • \n
\n\n

重要细节和常见错误(新手常忽略的问题)

\n\n

1. 区分大小写

\n

GetProperty 方法默认区分大小写。如果你指定 "name" 而不是 "Name",将找不到属性。

博客

书籍推荐