Получить аргументы делегата внутри делегата - PullRequest
2 голосов
/ 21 октября 2010

Может кто-нибудь помочь мне понять, как получить все параметры, передаваемые делегату внутри самого делегата?

У меня есть класс:

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

Вопрос в том, как получить переданные параметры "xxx" и "DATA" внутри метода getWhere ()?

Заранее спасибо.

Ответы [ 7 ]

5 голосов
/ 21 октября 2010

Вы не можете, потому что все наоборот.Вы не можете получить аргументы, потому что делегат не содержит их;метод getWhere должен будет передать значение параметра xxx при вызове делегата.Затем анонимный метод, на который ссылается делегат, получит это значение в качестве параметра xxx и в свою очередь передаст строку "DATA" в качестве аргумента для параметра dataValue при вызове getLike.Значения аргумента как таковые не являются частью состояния делегата.

Если вы хотите получить информацию о параметрах как таковых (не их значениях), вы можете сделать это:

// get an array of ParameterInfo objects
var parameters = dataList.Method.GetParameters();
Console.WriteLine(parameters[0].Name); // prints "xxx"
2 голосов
/ 21 октября 2010

Если вы используете:

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

тогда вы можете разделить выражение на его подвыражения и проанализировать их. Но я не уверен, что использование такого делегата, как вы, - правильная вещь.

1 голос
/ 21 октября 2010

Аргументы - это то, что вы предоставите при вызове делегата через dataList (args), а не получателем вызова. Если вы хотите предоставить дополнительную информацию для getWhere (), вы можете попробовать следующее ....

public ShopManager getWhere(Func<Object, Object> dataList, params object[] additonalData)
{
 // inspect the additionalData
}   
1 голос
/ 21 октября 2010

Вы можете получить имя функции, выполнив что-то вроде ниже.

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

это напечатает имя как 'xxx'

1 голос
/ 21 октября 2010

Вы не можете сделать это (легко).Но я не понимаю твою идею.По какой причине вам нужно заглянуть в dataList?Это просто анонимный метод, вы можете вызывать его и получать результаты, вам вообще не нужно его проверять или изменять.

Какова ваша идея?Почему бы просто не позвонить shopManager.getLike()?

0 голосов
/ 18 июля 2014
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;
}
0 голосов
/ 24 октября 2010

Спасибо за ответы, ребята, я решил использовать Expression> вместо общего делегата. Это позволяет получить обе стороны выражения - LHS и RHS.

Для тех, кто интересуется ответом, вот оно: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/0f6ca823-dbe6-4eb6-9dd4-6ee895fd07b5?prof=required

Спасибо за терпение и внимание.

...