如何通过ReflectionDynamicObject在.NET平台高效优化反射调用?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1443个文字,预计阅读时间需要6分钟。
基于封装的原则,API的设计者会将部分成员(属性、字段、方法等)隐藏以保证健壮性。但总有一些情况下,需要直接访问这些私有成员。为了访问一个特定类型的私有成员,除了修改API设计,还需要直接引用这些成员。
基于封装的原则,API 的设计者会将部分成员(属性、字段、方法等)隐藏以保证健壮性。但总有需要直接访问这些私有成员的情况。
为了访问一个类型的私有成员,除了更改 API 设计还有就是使用反射技术:
public class MyApi
{
public MyApi()
{
_createdAt = DateTime.Now;
}
private DateTime _createdAt;
public int ShowTimes { get; private set; }
public void ShowCreateTime()
{
Console.WriteLine(_createdAt);
ShowTimes++;
}
}
void Main()
{
var api = new MyApi();
var field = api.GetType().GetField("_createdAt", BindingFlags.NonPublic | BindingFlags.Instance);
var value = field.GetValue(api);
Console.WriteLine(value);
}
这种写法并不优雅:
- 代码冗长,编写麻烦。
- 实现比较绕,不太直观。
本文共计1443个文字,预计阅读时间需要6分钟。
基于封装的原则,API的设计者会将部分成员(属性、字段、方法等)隐藏以保证健壮性。但总有一些情况下,需要直接访问这些私有成员。为了访问一个特定类型的私有成员,除了修改API设计,还需要直接引用这些成员。
基于封装的原则,API 的设计者会将部分成员(属性、字段、方法等)隐藏以保证健壮性。但总有需要直接访问这些私有成员的情况。
为了访问一个类型的私有成员,除了更改 API 设计还有就是使用反射技术:
public class MyApi
{
public MyApi()
{
_createdAt = DateTime.Now;
}
private DateTime _createdAt;
public int ShowTimes { get; private set; }
public void ShowCreateTime()
{
Console.WriteLine(_createdAt);
ShowTimes++;
}
}
void Main()
{
var api = new MyApi();
var field = api.GetType().GetField("_createdAt", BindingFlags.NonPublic | BindingFlags.Instance);
var value = field.GetValue(api);
Console.WriteLine(value);
}
这种写法并不优雅:
- 代码冗长,编写麻烦。
- 实现比较绕,不太直观。

