C#怎么使用反射获取属性 C# Reflection动态调用方法

来源:这里教程网 时间:2026-02-21 17:33:49 作者:

在C#中,反射(Reflection)是运行时获取类型信息、动态创建对象、调用方法和访问属性的核心机制。要获取属性或动态调用方法,关键在于先拿到

Type
对象,再通过它查询成员并操作。

获取类的所有公共属性

使用

GetProperties()
方法可列出所有公共实例属性(默认不包括私有、静态或继承的属性):

若需包含私有属性,加
BindingFlags.NonPublic | BindingFlags.Instance
若需包含基类属性,加
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly
(去掉
DeclaredOnly
才含继承的)
示例:var props = typeof(Person).GetProperties(); —— 返回
PropertyInfo[]

通过反射读写属性值

拿到

PropertyInfo
后,用
GetValue()
SetValue()
操作具体对象的属性:

GetValue(obj)
:传入目标实例,返回属性值(注意处理 null 或值类型装箱)
SetValue(obj, value)
:第二个参数需与属性类型匹配,否则抛异常
对只读属性调用
SetValue
会失败;私有属性需确保 BindingFlags 已启用
NonPublic
示例:string name = (string)prop.GetValue(person);

动态调用方法(含参数和返回值)

GetMethod()
查找方法,再用
Invoke()
执行:

查找方法支持重载:可指定参数类型数组,如 type.GetMethod("Calculate", new[] { typeof(int), typeof(string) })
Invoke(obj, args)
中,
obj
null
表示调用静态方法;
args
是 object[],null 参数需显式写
null
泛型方法需先用
MakeGenericMethod()
构造封闭类型,再 Invoke
无返回值方法(void)调用后返回
null

安全与性能提醒

反射灵活但有代价:

每次反射调用都绕过编译期检查,错误在运行时报出,建议配合
try/catch
或提前验证
频繁调用时性能较差,可缓存
PropertyInfo
MethodInfo
,或用
Delegate.CreateDelegate
转为强类型委托提升速度
.NET Core/.NET 5+ 中,
System.Reflection.Emit
或表达式树(
Expression.Lambda
)适合高频场景

基本上就这些。掌握 Type → 成员查询 → 实例操作 这条主线,就能稳住大部分反射需求。

相关推荐