2011-01-14 105 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,通常在處理序列化和數據註釋時非常有用。