首页 > 解决方案 > 递归获取类的字段和属性类型

问题描述

假设我有一个这样的课程:

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将展开doubleList

我的想法

我知道我可以使用reflectiondeep first search做这件事。但我发现事情可能会变得复杂,因为类可以是generic class. 而且我担心是否有比generic class.

那么有什么比使用reflectiondeep first search创建这棵树更好的解决方案呢?

标签: c#genericsrecursionserializationreflection

解决方案


没有开箱即用的方法可以做到这一点,并且没有太多的边界,只有泛型,有简单的方法来获取泛型类型参数,你将不得不递归它们。

但是我认为你正试图以错误的方式解决这个问题。

如果我对您的理解正确,您希望防止出现序列化问题。我会从不同的角度来看待这个问题。

  1. 用接口装饰你的类以确保合同。
  2. 并且/命令将您的类/接口放在一个类库中,在那里它们不太可能是保险杠,甚至更进一步并消除它们。
  3. 如果您真的担心序列化问题,请使用基于合同的序列化程序,如 DataContracts,如果更改会中断并且可以进行版本控制。

更新

  1. 用户拥有需要序列化的类。

  2. 我使用 XmlSerializer 对其进行序列化和反序列化。

  3. 我要解决的问题是:

    • 首先,用户像上面一样定义了 Class1,并将它部署到机器 A 和机器 B。
    • 然后用户在 Class1 中添加了一个公共字段 x,机器 A 的部署比 B 快,所以机器 A 识别了新添加的 x。但是机器 B 的部署比较慢,所以机器 B 不知道 x,那么机器 B 的序列化就会中断。
    • 所以现在我想确保传递给我的序列化程序的类不再发生变化。

然后你需要反思,没有我能想到的图书馆可以满足你的需求。您将不得不深入研究泛型类型并回避,故事结束


推荐阅读