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在此示例中。
可能不完全是您要查找的语法,但您可以将扩展方法作为动态对象上的简单静态方法调用:
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>
的东西来调用它?