C# 获取字段和属性';递归地定义类的类型

C# 获取字段和属性';递归地定义类的类型,c#,generics,recursion,serialization,reflection,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

假设我有一个这样的班级:

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
类别2
int
双重的
除非此成员是原子类型(如
int
double
List
和所有系统定义的类型),否则树将展开

我的想法 我知道我可以使用
reflection
deep first search
来做这件事。但是我发现事情可能会变得复杂,因为这个类可以是
泛型类
。我关心的是是否有比
泛型类
更复杂的情况


因此,有什么比使用
反射
深度优先搜索
创建此树更好的解决方案呢?

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

然而,我认为你试图以错误的方式解决这个问题

如果我理解正确,您希望防止序列化问题。我会从另一个角度来看这个问题

  • 用接口装饰类以确保契约
  • And/order将类/接口放在类库中,这样它们就不太可能被缓冲,甚至可以更进一步地获取它们
  • 如果您确实担心序列化问题,请使用基于契约的序列化程序,如DataContracts,它会在更改时中断,并且可以进行版本控制
  • 更新

  • 用户拥有需要序列化的类

  • 我使用XmlSerializer对其进行序列化和反序列化

  • 我想解决的问题是:

    • 首先,用户定义了如上所述的Class1,它是 部署到机器A和机器B
    • 然后用户添加了一个公共 字段x进入Class1,机器A的部署速度比B快 机器A识别了新添加的x。但是机器B的部署是错误的 较慢,因此机器B不知道x,那么序列化将中断 对于机器B
    • 所以现在我想确保不再对 类传递给我的序列化程序

  • 然后你需要反思,我想不出有什么图书馆能满足你的需要。您必须深入研究泛型类型并重复使用,故事结束

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

    确定您可以这样做,并且反射就是它将使用的。但是这里的用例是什么?用例是:我想确保
    Class1
    的定义不会改变,那么
    Class1
    的改变只意味着
    类型和
    名称(如果成员有
    xmlement
    属性,那么它的名称应该是
    ElementName
    )在所有可序列化的
    成员中,
    成员不会更改。所以我想存储class1的所有类型和名称信息。反射非常适合您的需要。你为什么不用它?泛型类的复杂性是什么?@Caesium-oh所以这是为了阻止肮脏的小手指改变类。将其卡入部件或nuget释放。。无论如何,我认为你的问题是在反射和输出泛型类型时如何处理泛型类型parameters@TheGeneral我不知道什么意思把它扔进一个集合。。。你能说清楚吗。用户拥有需要序列化的类。2.我使用
    XmlSerializer
    对其进行序列化和反序列化。3.我想解决的问题是:首先,用户定义了如上所述的
    Class1
    ,并将其部署到机器A和机器B。然后,用户在
    Class1
    中添加了一个公共字段
    x
    ,机器A的部署速度比B快。因此机器A重新识别了新添加的
    x
    。但是机器B的部署速度较慢,因此机器B不知道
    x
    ,那么机器B的序列化将中断。因此,现在我想确保传递给我的序列化程序的类不再发生更改。@Caesium已更新,但是(不幸的是)您最初的问题是不使用反射,这是我在不写反射代码的情况下能给出的最好答案。如果唯一的边界情况是泛型类型,那么我认为问题没有那么复杂……谢谢。@Caesium是的,如果你对反射代码有问题,只要问一个新问题,它会在一瞬间被排序