C# 在委托内获取委托参数
有人能帮我理解如何在委托内部将所有参数传递给委托吗 我有课:C# 在委托内获取委托参数,c#,delegates,expression,C#,Delegates,Expression,有人能帮我理解如何在委托内部将所有参数传递给委托吗 我有课: public class ShopManager : ShopEntities { public ShopManager getWhere(Func<Object, Object> dataList) { var x = dataList.???; // how to get arguments? return this; } public Object
public class ShopManager : ShopEntities
{
public ShopManager getWhere(Func<Object, Object> dataList)
{
var x = dataList.???; // how to get arguments?
return this;
}
public Object getLike(Object dataValue)
{
return dataValue;
}
}
问题是:如何在方法getWhere()中获得传递的参数“xxx”和“DATA”
提前谢谢。你不能(轻松地)做到这一点。但我不明白你的想法。您需要查看数据列表的原因是什么?这只是一个匿名方法,您可以调用它并获得结果,您根本不需要检查或修改它
你的想法是什么?为什么不直接调用shopManager.getLike()
?你不能,因为这是另一种方式。无法获取参数,因为委托未持有这些参数;调用委托时,getWhere
方法需要为xxx
参数传递一个值。委托引用的匿名方法随后将接收此值作为xxx
参数,然后在调用getLike
时将字符串“DATA”
作为dataValue
参数传递。参数值本身不是委托状态的一部分
如果要获取有关参数本身的信息(而不是其值),可以执行以下操作:
// get an array of ParameterInfo objects
var parameters = dataList.Method.GetParameters();
Console.WriteLine(parameters[0].Name); // prints "xxx"
您可以通过如下操作获得函数名
var x = dataList.GetInvocationList().FirstOrDefault().Method.GetParameters();
sring name = x.FirstOrDefault().Name
如果您使用:
public ShopManager getWhere(Expression<Func<Object, Object>> dataList)
public ShopManager getWhere(表达式数据列表)
然后,您可以将表达式划分为子表达式并对其进行解析。但是我不确定像您这样使用委托是否正确。参数是您在通过数据列表(args)调用委托时提供的,而不是由调用的接收者提供的。如果要向getWhere()提供其他信息,可以尝试以下操作
public ShopManager getWhere(Func<Object, Object> dataList, params object[] additonalData)
{
// inspect the additionalData
}
public ShopManager getWhere(Func数据列表,参数对象[]additonalData)
{
//检查附加数据
}
感谢各位的回复,我决定使用Expression>而不是common delegate。这允许获得表达式的两侧-LHS和RHS 对于那些对答案感兴趣的人,以下是: 感谢您的耐心和关注。
公共静态列表GetMethodParameterValues(委托方法)
public static List<object> GetMethodParameterValues(Delegate method)
{
var target = method.Target;
if (target == null) return null;
var fields = target.GetType().GetFields();
var valueList = fields.Select(field => field.GetValue(target)).ToList();
return valueList;
}
{
var target=方法.target;
if(target==null)返回null;
var fields=target.GetType().GetFields();
var valueList=fields.Select(field=>field.GetValue(target)).ToList();
返回价值清单;
}
在上面的示例中,您只需执行dataList:“var x=dataList();”,就可以得到“DATA”,但我猜这不是您的意思?这不起作用。目标是绑定委托中使用的实例字段的对象。()因此,您所做的是读取调用委托的对象的字段,而不是委托的方法参数。
public static List<object> GetMethodParameterValues(Delegate method)
{
var target = method.Target;
if (target == null) return null;
var fields = target.GetType().GetFields();
var valueList = fields.Select(field => field.GetValue(target)).ToList();
return valueList;
}