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;
}