2010-11-30 76 views
0

我將vb.net轉換爲c#.net時出現更多問題。在對象上轉換vb.net靜態方法調用

我有一些在vb.net文件有「選項嚴格關閉」,以允許糟糕的編程。當我轉換爲C#我用「動態」的,直到我回來和解決問題,這一點也適用於所有情況

但現在我有這樣的代碼:

Public Class ContractResults 
    'Big class definition 
    Public Shared Sub CleanCache() 
     'Code here 
    End Sub 
End Class 

而且與Option Strict Off選項文件:

Public Sub VerifyResults(result as Object) 
    'Here, result is normally ContractResults 
    'first it check for that then call this: 
    result.CleanCache() 
End Sub 

在c#中我使用「dynamic」,但是當我使用動態引用調用「static」方法時會彈出運行時錯誤。在vb.net中,我可以稱爲「共享」的情況下分,但在C#這是不允許的

例外: 「Microsoft.CSharp.RuntimeBinder.RuntimeBinderException」 「會員‘ContractTypes.ContractResults.CleanCache()’不能使用實例引用進行訪問;使用類型名稱來代替它「

看來我必須將代碼轉換爲使用實際類型,但這意味着需要重寫更多的部分。有人能夠展示另一種方式嗎?

我要確保你不認爲我可以使用

(result as ContractResults).CleanCache(); 

因爲可以在傳遞各類具有「CleanCache()」方法,但不從什麼比其它同繼承「目的」。有很多類型(30!)有這種「靜態」方法,所以這就是爲什麼它使用Option Strict Off

+1

對於30種類型,我只需將Option Strict On打開並在VB中修復它。 IDE會給你每個警告,你應該能夠快速完成所有事情。 – 2010-11-30 19:23:03

回答

2

你可以使用reflection

result.GetType().InvokeMember("CleanCache", BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy, null, null, new object[0]); 

(未經測試

+0

這項工作:我不得不添加「BindingFlags.InvokeMember」。在這個循環中運行的一個問題似乎在減慢代碼的速度,但我喜歡它進行轉換 - 在我眼中,轉換錯誤的代碼變成了糟糕的代碼。我會投票,但我不夠用戶。 – 2010-11-30 19:24:51

+1

是的,這是一個等待清理的解決方法。 – dtb 2010-11-30 19:25:44

1

由於錯誤提示,您必須從類調用靜態方法,而不是實例:

ContractResults.CleanCache(); 

你可以把你的30種類型放入switch語句中,但這會很醜。

1

我很抱歉這樣說,但原來的決定,把選項嚴格關是糟糕的一年。不知何故,我懷疑最初編寫的代碼做了你認爲它無論如何都在做的事情。

現在是時候繼續並解決該問題。