递归获取类的字段和属性的类型

时间:2018-11-22 03:48:10

标签: c# generics recursion serialization reflection

假设我有这样一个课:

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>

除非该成员是原子类型(例如intdoubleList和所有系统定义的类型),否则树将展开。

我的想法

我知道我可以使用reflectiondeep first search来完成此操作。但是我发现事情可能变得复杂,因为该类可以是generic class。我担心的是,是否存在比generic class更复杂的情况。

因此,有比使用reflectiondeep first search创建此树更好的解决方案吗?

2 个答案:

答案 0 :(得分:1)

没有现成的方法可以做到这一点,并且没有太多的界限,只有泛型,有简单的方法来获取泛型类型参数,您将必须递归它们。

但是我认为您正在尝试以错误的方式解决此问题。

如果我对您的理解正确,则希望避免序列化问题。我会从另一个角度来看这个问题。

  1. 用接口装饰您的类,以确保签订合同。
  2. 然后//将您的类/接口放到一个类库中,在这些类库中它们不太可能碰碰到,甚至走得更远,然后弄乱它们。
  3. 如果您真的担心序列化问题,请使用基于合同的序列化器(例如DataContracts),如果更改,它将破坏版本并可以进行版本控制。

更新

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

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

  4.   
  5. 我要解决的问题是:

         
        
    • 首先,用户像上面一样定义Class1,它是   部署到机器A和机器B。
    •   
    • 然后用户添加了一个公开的   字段x进入Class1,机器A的部署比B快。   机器A确认新添加的x。但是机器B的部署是   比较慢,所以机器B不知道x,那么序列化将中断   用于机器B。
    •   
    • 所以现在我要确保不再更改   类传递给我的序列化器。
    •   
  6.   

然后您需要反思,没有我能想到的库可以满足您的需求。您将不得不深入研究通用类型并重新使用,故事结束

答案 1 :(得分:0)

我相信FormatterServices.GetSerializableMembers将返回所有可序列化的成员,就像您在问题中最初提出的那样。