c# - 递归获取类的字段和属性类型
问题描述
假设我有一个这样的课程:
public class Class1 {
public int x1;
public Class2 x2;
public double x3;
}
public class Class2 {
public int y1;
private int x2;
}
有什么方法可以获取所有可序列化成员的所有类型信息(我认为它的所有公共字段和属性没有对私有成员的明确声明)Class1
?
例如,我想创建这样一个类型树:
<Class1>
<x1>int</x1>
<x2>Class2</x2>
<Class2>
<y1>int</y1>
</Class2>
<x3>double</x3>
</Class1>
除非此成员是原子类型(如 、 和所有系统定义类型),否则树int
将展开double
。List
我的想法
我知道我可以使用reflection
并deep first search
做这件事。但我发现事情可能会变得复杂,因为类可以是generic class
. 而且我担心是否有比generic class
.
那么有什么比使用reflection
和deep first search
创建这棵树更好的解决方案呢?
解决方案
没有开箱即用的方法可以做到这一点,并且没有太多的边界,只有泛型,有简单的方法来获取泛型类型参数,你将不得不递归它们。
但是我认为你正试图以错误的方式解决这个问题。
如果我对您的理解正确,您希望防止出现序列化问题。我会从不同的角度来看待这个问题。
- 用接口装饰你的类以确保合同。
- 并且/命令将您的类/接口放在一个类库中,在那里它们不太可能是保险杠,甚至更进一步并消除它们。
- 如果您真的担心序列化问题,请使用基于合同的序列化程序,如 DataContracts,如果更改会中断并且可以进行版本控制。
更新
用户拥有需要序列化的类。
我使用 XmlSerializer 对其进行序列化和反序列化。
我要解决的问题是:
- 首先,用户像上面一样定义了 Class1,并将它部署到机器 A 和机器 B。
- 然后用户在 Class1 中添加了一个公共字段 x,机器 A 的部署比 B 快,所以机器 A 识别了新添加的 x。但是机器 B 的部署比较慢,所以机器 B 不知道 x,那么机器 B 的序列化就会中断。
- 所以现在我想确保传递给我的序列化程序的类不再发生变化。
然后你需要反思,没有我能想到的图书馆可以满足你的需求。您将不得不深入研究泛型类型并回避,故事结束
推荐阅读
- django-rest-framework - TypeError:“FieldFile”对象不可调用
- javascript - 从另一个页面返回 index.html 时如何调用 .click()
- docker - Alpine bind() 上的 ChromeDriver 返回错误,errno=0: Address not available (99)
- android - 如何在 Retrofit (Kotlin) 中获取响应状态?
- javascript - 如何从 auth.config.ts 中获取值?
- flow-project - 基准场景“Merge”中的模拟参数和奖励计算
- sap - SAT比ST12有什么优势吗?
- c - 为什么我应该在调用 fork() 之后和调用 exec...() 之前关闭所有文件描述符?我该怎么做?
- c# - 母版页中的用户控件中的用户控件并设置属性c#
- c# - C# Timer 将 null 传递给 Elapsed 事件处理程序的源参数