2013-02-03 70 views
2

我有一個方法Base class它調用(通過反射到另一個方法)。c#動態擴展方法的解決方案?

type.InvokeMember(context.Request["MethodName"], 
        System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance, 
        null, 
        this, 
        new object[] { context, Jobj }); // jObj is dynamic 

jObj參數類型是dynamic(不能更改此類型)。

如果MethodName字符串值是: 「getFinanceDetails」,使方法被調用..

void getFinanceDetails(object contextObj, dynamic obj) 
{ 

    //Here I need to do obj["Inv_num"].ToString().Decrpyt() (my extension method). 
    //but it goes Bang cause I cant use extension method for dynamic. 
    //But I cant also send it decrypted from base cause not all values are encrpyrted. 

} 

然而 - 我沒有使用(在方法內)解決它:

((object) obj["Inv_num"]).ToString().Decrypt(); 

但我不想每次都施放對象,只是爲了啓用擴展方法。

有什麼我可以用param type發送來解決它嗎?

我的願望:

我希望能夠做到: obj.ToString().Decrpyt() obj["Inv_num"].ToString().Decrpyt()

編輯

public static string Decrypt(this string obj) 
     { 
      Func<string, string> Decrypt = Encryptions.GetDecryptedCode; 
      return Decrypt(obj); 

     } 
  • OBJ(在這種情況下IDictionary<string , object>)。 所以我應該可以讀取屬性。 (inv_num此示例中
+2

您沒有給我們足夠的信息。什麼*確切*是你的擴展方法?什麼'obj.ToString()'返回? '[「Inv_nim」]'的相關性是什麼? –

+0

在調用方法之前不能投射jObj嗎? 'new object [] {(YourType)jObj})'? –

+0

@JonSkeet編輯。謝謝。 –

回答

2

假設obj["Inv_num"].ToString()已經返回正確的值,你可以很容易做的兩個步驟:

string text = obj["Inv_num"].ToString(); 
var decrypted = text.Decrypt(); 

說實話,目前還不清楚爲什麼getFinanceDetails(應改爲遵循.NET命名約定)不能寫成:

void getFinanceDetails(object contextObj, IDictionary<string, object> obj) 
{ 
    var decrypted = obj["Inv_num"].ToString().Decrypt(); 
} 

你永遠需要的東西,實現IDictionary<string, object>稱呼它?

+0

'getFinanceDetails'不能被稱爲對象因爲我不能做到:obj [「xxx」]。 (在運行時,類型是字典....) –

+0

@RoyiNamir:但你原來的問題說你只是想做'obj.ToString()。Decrypt()' - 沒有提到'obj [ 「你可能對你的需求非常不清楚(你能把類型改爲'IDictionary '嗎?' –

+1

我認爲getFinanceDetails'爲什麼不能被重寫正如所提出的那樣:這是因爲動態表達式是在運行時計算的,但是擴展方法是由編譯器重新編譯的(在編譯時),所以運行時試圖調用'obj.Decrypt()'而不是'Extensions.Decrypt(obj)因爲編譯器不知道應該調用擴展方法 –

4

也許不完全是你要找的,但你可以調用擴展方法的動態對象上一個簡單的靜態方法的語法:

void getFinanceDetails(object contextObj, dynamic obj) 
{ 
    var decryptedValue = MyExtensions.Decrypt(obj); 
} 

這顯然假定在運行時obj是您的擴展方法運行的正確類型。在您的問題中,您顯示了一些obj["Inv_num"],好像obj是一個複雜類型,其屬性爲Inv_num,它的類型是字符串。因此,您可能需要調整正確的類型:

var decryptedValue = MyExtensions.Decrypt(obj["Inv_num"]); 
+0

謝謝,但我試圖阻止這種_method調用wrapper_。並且只執行「流利」方法調用,如'x.Do()。Do2()' –

+0

您不能在動態對象上調用擴展方法。這不被您使用的編程語言(C#)支持。我建議你採取一種解決方法。另一個解決方法是根本不使用任何'動態'類型。 –