繁体   English   中英

.NET中的深层反思

[英]Deep Reflection in .NET

我需要创建钻取两三个对象属性的能力。 例如,类A具有对类B的属性引用,我需要访问类C.执行此操作的最佳方法是:直接反射,或者可能使用TypeDescriptor,还是其他什么?

谢谢。

写起来并不难。 我把几个类放在一起处理这个,所以我可以序列化WinForm的属性。 看看这个课程和相关的课程。

http://csharptest.net/browse/src/Library/Reflection/PropertySerializer.cs

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

    [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的实现必须识别内置类型并相应地处理它们,这是典型的事情,如字符串,char,整数,double,DateTime等。

  • 如果遇到序列或集合,则需要写出许多值。
  • 如果遇到非平凡类型,您将再次应用此递归模式。

最终结果是一个递归算法,遍历您的对象模型并在遇到我知道如何序列化的类型时写出值。

但是,我建议调查WCF,不是用于构建服务,而是用于序列化。 它作为.NET 3.0框架的一部分提供了一个新的程序集System.Runtime.Serilization,并且在处理序列化和数据注释时通常非常有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM