在委托中获取委托参数

时间:2010-10-21 08:07:44

标签: 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 getLike(Object dataValue)
    {
        return dataValue;
    }
}

然后我称之为:

ShopManager shopManager = new ShopManager()
var demo = shopManager.getWhere(xxx => shopManager.getLike("DATA"));

问题是:如何在方法getWhere()中传递参数“xxx”和“DATA”?

提前致谢。

7 个答案:

答案 0 :(得分:5)

你不能,因为它是另一种方式。您不能获取参数,因为委托不持有它们;调用委托时,getWhere方法需要传递 xxx参数的值。然后,委托引用的匿名方法将接收此值作为xxx参数,并在调用"DATA"时将字符串dataValue作为getLike参数的参数传递。这样的参数值不是委托状态的一部分。

如果您想获取有关参数的信息(而不是它们的值),您可以这样做:

// get an array of ParameterInfo objects
var parameters = dataList.Method.GetParameters();
Console.WriteLine(parameters[0].Name); // prints "xxx"

答案 1 :(得分:2)

如果您使用:

public ShopManager getWhere(Expression<Func<Object, Object>> dataList)

然后你可以将Expression分成它的子表达式并解析它们。但我不确定像你这样使用代表是否是正确的事情。

答案 2 :(得分:1)

你不能(轻松)。但我不明白你的想法。您需要查看dataList的原因是什么?这只是一个匿名方法,您可以调用它并获得结果,您根本不需要检查或修改它。

你的想法是什么?为什么不打电话给shopManager.getLike()

答案 3 :(得分:1)

您可以通过执行以下操作获取功能名称。

  var x =  dataList.GetInvocationList().FirstOrDefault().Method.GetParameters();
  sring name = x.FirstOrDefault().Name 

这会将名称打印为'xxx'

答案 4 :(得分:1)

参数是在通过dataList(args)调用委托时提供的,而不是调用的接收者。如果您想为getWhere()提供其他信息,可以尝试以下方法....

public ShopManager getWhere(Func<Object, Object> dataList, params object[] additonalData)
{
 // inspect the additionalData
}   

答案 5 :(得分:0)

感谢回复家伙,我决定使用Expression&gt;而不是共同的代表。这样就可以得到表达的两面--LHS和RHS。

对于那些有兴趣回答的人,就是这样: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/0f6ca823-dbe6-4eb6-9dd4-6ee895fd07b5?prof=required

感谢您的耐心和关注。

答案 6 :(得分:-1)

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