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();

但我不想每次都投射到 object ,只是为了启用扩展方法。

我可以通过发送参数类型来解决它吗?

我的愿望 :

我希望能够做到: 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"]好像是具有称为字符串obj类型的属性的复杂类型。Inv_num因此,您可能需要调整正确类型的调用:

var decryptedValue = MyExtensions.Decrypt(obj["Inv_num"]);
于 2013-02-03T09:39:39.067 回答
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>

于 2013-02-03T09:41:38.850 回答