Захват входящих значений аргумента в массиве KeyValuePair - PullRequest
6 голосов
/ 07 мая 2009

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

То есть, звонок как:

MyMethod(10, "eleven");

Для метода:

void MyMethod(int Test, str Test2) {}

Разрешается в массиве, как:

{{"Test" => 10}, {"Test2", "eleven"}}

Было бы еще лучше, если бы я мог достичь этого с помощью размышлений. как-то с StackTrace.

Ответы [ 6 ]

3 голосов
/ 07 мая 2009

Я думаю, что вы ищете, не существует. Самое близкое, что вы можете иметь, это params:

MyMethod(params object[] args) 
{
    // if you have to do this, it's quite bad:
    int intArg = (int)args[0];
    string stringArg = (string)arg[1]:
}

// call with any number (and type) of argument
MyMethod(7, "tr");

Нет проверки типов во время компиляции, и, следовательно, это не универсальный способ обработки аргументов. Но если ваши аргументы динамические, это, вероятно, решение.


Редактировать: была еще одна идея:

Вам необходимо поместить все аргументы вручную в список / словарь. Вы можете написать вспомогательный класс, чтобы разрешить следующее:

MyMethod(int arg1, string arg2) 
{
    Arguments.Add(() => arg1);
    Arguments.Add(() => arg2);
    //
}

Помощник выглядит так

public static void Add<T>(Expression<Func<T>> expr)
{
    // run the expression to get the argument value
    object value = expr.Compile()();
    // get the argument name from the expression
    string argumentName = ((MemberExpression)expr.Body).Member.Name;

    // add it to some list:
    argumentsDic.Add(argumentName, value);
}
2 голосов
/ 07 мая 2009

Лучше всего сделать это с анонимным типом, как показано в в этом примере .

0 голосов
/ 11 декабря 2012

Возможно, это будет не совсем то, что вы искали, но я обнаружил, что могу найти разумный компромисс для своей ситуации, используя вариант метода, предложенного Мэттом Гамильтоном, и используя неявное именование параметров анонимного типа:

public void MyMethod(string arg1, bool arg2, int arg3, int arg4)
{
    var dictionary = new PropertyDictionary(new 
    { 
        arg1, arg2, arg3, arg4 
    });
}

public class PropertyDictionary : Dictionary<string, object>
{
    public PropertyDictionary(object values)
    {
        if(values == null)
            return;

        foreach(PropertyDescriptor property in TypeDescriptor.GetProperties(values))
            Add(property.Name, property.GetValue(values);   
    }
}    

Как я уже сказал, это может быть не полезно в вашей ситуации, но в моем (модульное тестирование - метод, который обрабатывает XML) это было очень полезно.

0 голосов
/ 07 мая 2009

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

Как уже говорилось, ключевое слово params может использоваться для определения метода с переменным числом параметров, но по определению они безымянные.

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

0 голосов
/ 07 мая 2009

Один из способов, который я знаю (не уверен, что в настоящее время это only , но раньше), - это использование аспектно-ориентированного программирования (AOP) и, в частности, перехват. Немного больно катать его вручную, но на помощь приходят отличные инструменты. Одним из таких инструментов является PostSharp: http://www.postsharp.org/.

0 голосов
/ 07 мая 2009

Хороший вопрос (+1). Я думаю, что это то, что вам нужно -

MethodBase mb = MethodBase.GetCurrentMethod();
ParameterInfo[] pi = mb.GetParameters();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...