2016-01-14 25 views
4

我正在查看內部.Net類的源代碼,並且想要使用反射來修改函數。 (通過原有功能的每一行改寫成新的功能使用反射,並添加我的修改到它)如何將對象轉換爲內部類

object responseObject = request.ConnectionAsyncResult.InternalWaitForCompletion(); 
ConnectStream writeStream = responseObject as ConnectStream; 
if (writeStream == null) ... 

我應該如何寫代碼的第二行?

該代碼正在檢查一個對象是否是特定的類,但我不知道如果這個類是一個內部類如何做到這一點。如何將對象轉換爲內部類?

ConnectStream是一個內部類

+0

*「修改功能」* - 您打算怎麼做?我不認爲C#具有元編程功能。我錯了嗎? – Domysee

+0

我使用反射改寫原始函數的每一行,並將其添加到其中 –

+1

你如何重寫方法? – thehennyy

回答

3

嘛,你不知道。你只需要使用反射的每一步 - 編譯器肯定不會幫你:)

「重寫每一行」是一個壞主意 - 無論如何 - 這是一個有點棘手的代碼作品。相反,你可能只想讓你的助手方法調用原始方法,以及做你需要做的任何事情。

使用反射時,在編譯時不需要知道類型,並且不需要遵守所有C#的規則。這大致相當於原來的一個代碼可能是這個樣子:

if (responseObject != null && responseObject.GetType().Name == "ConnectStream") 

根據您的實際需求,有更好的方法,以使該檢查以及 - 例如,你可以採取System.Net組裝並找到ConnectStream鍵入正確的命名空間和所有內容,並直接比較兩個Type實例。但是在這樣的代碼中,它並不是真的有必要。

+0

我需要在方法中添加修改,所以我不能調用原始方法。我知道我需要爲每一步使用反射,並且我在問我應該如何編寫代碼的第二行。對不起,如果我的問題不清楚 –

+0

@IsoletChan這就是我告訴你 - 你不知道。您必須使用Reflection API來調用您需要調用的任何內容,並進行必要的任何類型檢查。從字面上看,'responseObject.GetType()。GetMethod(...)。Invoke(...);'。它非常*乏味,但是這是您爲破壞不變量而付出的代價:) – Luaan

+0

是的,我正在使用反射API並編寫這些乏味的代碼。你會如何編寫代碼的第二行? –