c#动态和扩展方法解决方案?

时间:2013-02-03 09:26:42

标签: c# .net dynamic reflection

我在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。

2 个答案:

答案 0 :(得分: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"]);

答案 1 :(得分: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>的内容来调用它?