2011-01-14 66 views
3

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

谢谢。

+0

是属性public? – Simon 2011-01-14 03:06:05

+2

我们能获得更多细节吗?任何类型的用法或示例代码?我用Reflection完成了各种各样的事情,但我仍然不确定自己明白自己想做什么。 – jcolebrand 2011-01-14 03:06:23

+0

@Simon是,它的公众。 @drachenstern我基本上正在尝试做@Simon在他的帖子中做的事情。 – 2011-01-14 12:52:57

回答

1

如果你知道在静态情况下的路径(即路径总是相同)和属性都可以访问(内部或公开),您可以使用动态

[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); 
    } 
0

我你无论出于何种原因,都想写你自己的序列化代码,你将会使用反射。

你所做的是你写一个递归的方法来serlizating一个类型。然后,您可以按照您认为合适的方式应用此结果。

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框架的一部分发布,并带有一个新的程序集System.Runtime.Serilization,通常在处理序列化和数据注释时非常有用。