簡體   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