2

(別のBase classメソッドへのリフレクションによって)呼び出すメソッドがあります。

  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タイプの送信でそれを修正するためにできることはありますか?

私の欲求 :

できるようになりたい: 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。
4

2 に答える 2

4

おそらくあなたが探していた構文とは正確には一致しませんが、動的オブジェクトの単純な静的メソッドとして拡張メソッドを呼び出すことができます。

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

これは明らかに、実行時objに拡張メソッドが動作する正しいタイプであることを前提としています。あなたの質問では、文字列型であるというプロパティを持つ複合型であるobj["Inv_num"]かのようにいくつかを示しました。したがって、適切なタイプで呼び出しを調整する必要がある場合があります。objInv_num

var decryptedValue = MyExtensions.Decrypt(obj["Inv_num"]);
于 2013-02-03T09:39:39.067 に答える
2

すでに正しい値を返していると仮定するobj["Inv_num"].ToString()と、2つのステップで簡単に行うことができます。

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>か?

于 2013-02-03T09:41:38.850 に答える