C# NET中的深度反思

C# NET中的深度反思,c#,.net,reflection,C#,.net,Reflection,我需要创建钻取对象属性的能力,例如两个或三个深度。例如,类A有一个对类B的属性引用,我需要访问类C。实现这一点的最佳方法是什么:直接反射,或者使用TypeDescriptor,或者其他什么 谢谢。写起来并不难。我将几个类放在一起处理这个问题,以便可以序列化WinForm的属性。看看这个类和相关的类 如果您知道静态上下文中的路径(即路径始终相同),并且可以访问属性(内部或公共),则可以使用动态 [Test] public void Foo() { var a

我需要创建钻取对象属性的能力,例如两个或三个深度。例如,类A有一个对类B的属性引用,我需要访问类C。实现这一点的最佳方法是什么:直接反射,或者使用TypeDescriptor,或者其他什么


谢谢。

写起来并不难。我将几个类放在一起处理这个问题,以便可以序列化WinForm的属性。看看这个类和相关的类


如果您知道静态上下文中的路径(即路径始终相同),并且可以访问属性(内部或公共),则可以使用动态

    [Test]
    public void Foo()
    {
        var a = new A
        {
            B = new B
            {
                C = new C
                {
                    Name = "hello"
                }
            }
        };


        DoReflection(a);
    }

    private void DoReflection(dynamic value)
    {
        string message = value.B.C.Name;
        Debug.WriteLine(message);
    }

如果你想写自己的序列化代码,不管出于什么原因,你都会使用反射

您要做的是编写一个递归方法来序列化类型。然后,根据您认为合适的情况应用此方法以获得结果

var type = myObjectOfSomeType.GetType();
// now depending on what you want to store
// I'll save all public properties
var properties = type.GetProperties(); // get all public properties
foreach(var p in properties)
{
    var value = p.GetValue(myObjectOfSomeType, null);
    Writevalue(p.Name, value);
}
WriteValue
的实现必须识别内置类型并相应地处理它们,这是典型的字符串、字符、整数、双精度、日期时间等

  • 如果遇到序列或集合,则需要写出许多值
  • 如果它遇到一个非平凡类型,您将再次应用此递归模式
最终的结果是一个递归算法,它遍历对象模型并在遇到我知道如何序列化的类型时写出值


但是,我确实建议研究WCF,不是为了构建服务,而是为了序列化。它是.NET 3.0框架的一部分,带有一个新的assembly System.Runtime.serialization,通常在处理序列化和数据注释时非常有用。

我们可以获得更多详细信息吗?任何类型的用法或示例代码?“我已经做了各种各样的反思,但我仍然不确定我是否理解你想做什么。”西蒙:是的,这是公开的@drachenstern我基本上是在尝试@Simon在他的文章中所做的事情。我正在创建一个序列化深层对象的过程,但以一种特殊的方式来满足特定的需要。我正在创建一个集中的过程,所以我需要能够在不知道属性是什么的情况下完成它。那是个好主意。