C#通过属性名称获取(读取)属性值的方法
在C#开发中,若需根据属性名(字符串)动态读取对象的具体数值,标准做法是借助反射机制。本文将演示如何构建通用的取值方法,消除硬编码的分支判断。
核心原理与操作
在.NET中,反射允许我们在运行时检查类型信息。要获取指定名称属性的值,主要依赖 System.Reflection 命名空间下的两个关键动作:先通过属性名查找 PropertyInfo 实例,再执行取值操作。实质语句只有一句:
this.GetType().GetProperty(propertyName).GetValue(this, null);
其中:
1. this.GetType() 获取当前运行对象的类型描述符。
2. GetProperty(propertyName) 利用传入的字符串参数匹配公共(public)属性。
3. GetValue(this, null) 返回该属性在当前实例上的值;第二个参数用于索引器属性,普通属性传 null 即可。
实现方案对比
第1步:使用抽象基类实现通用方法
目的:创建一个可复用的父类,使所有继承它的子类都自动拥有“按名取值”的能力。
操作步骤:
- 定义一个抽象类
AbstractGetValue。 - 在该类中实现
GetValue(string propertyName)方法,核心逻辑即上面提到的反射语句。 - 让具体业务类(如
Person,Demo)继承此类。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace PropertyNameGetPropertyValueDemo
{
class Program
{
static void Main(string[] args)
{
Person ps = new Person();
ps.Name = "CTZ";
ps.Age = 21;
Demo dm = new Demo();
dm.Str = "String";
dm.I = 1;
// 输出结果: CTZ, 21, String, 1
Console.WriteLine(ps.GetValue("Name"));
Console.WriteLine(ps.GetValue("Age"));
Console.WriteLine(dm.GetValue("Str"));
Console.WriteLine(dm.GetValue("I"));
}
}
abstract class AbstractGetValue
{
public object GetValue(string propertyName)
{
return this.GetType().GetProperty(propertyName).GetValue(this, null);
}
}
class Person : AbstractGetValue
{
public string Name { get; set; }
public int Age { get; set; }
}
class Demo : AbstractGetValue
{
public string Str { get; set; }
public int I { get; set; }
}
}
第2步:直接在类内部简化实现
目的:如果不需要复杂的层级管理,可直接将方法添加到单个类中,代码更精简。
操作步骤:
- 在目标类(例如
Person)中添加私有或公共方法。 - 复用相同的反射逻辑,无需额外继承链。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GetValue
{
class Program
{
static void Main(string[] args)
{
Person ps = new Person();
ps.Name = "CTZ";
ps.Age = 21;
// 输出结果: CTZ, 21
Console.WriteLine(ps.GetValue("Name"));
Console.WriteLine(ps.GetValue("Age"));
}
}
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public object GetValue(string propertyName)
{
return this.GetType().GetProperty(propertyName).GetValue(this, null);
}
}
}
注意事项与排错
缺失属性异常: GetProperty` 如果未找到对应名称的属性(区分大小写),将返回 null。随后调用 .GetValue` 时会抛出 NullReferenceException。建议在开发环境中增加判空保护。
性能考量: 反射属于运行时行为,相比直接属性访问开销较大。如果需要在高频循环中大量调用,应考虑将 GetProperty` 的结果进行缓存(例如使用字典存储委托),或者结合表达式树(Expression Trees)生成编译后的委托以提升性能。
以上就是C#通过属性名称获取属性值的详细内容,更多关于C#反射读取属性的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













