C# 动态和扩展方法解决方案

本文关键字:方法 解决方案 扩展 动态 | 更新日期: 2023-09-27 17:57:06

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

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

我可以用参数类型发送做些什么来修复它吗?

我的愿望 :

我希望能够做到: 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在此示例中。

C# 动态和扩展方法解决方案

可能不完全是您要查找的语法,但您可以将扩展方法作为动态对象上的简单静态方法调用:

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"]);

假设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>的东西来调用它?