2016-03-10 2 views
0

Мне нужно создать строку параметров стиля CSV, сопоставленную с их значениями. Например:Возможно ли получить исходное имя параметра с помощью nameof() в выражении лямбда?

static void MyMethod(int i, string str, object obj, bool flag) 
{ 
    string example = "i=123,str=Hello,obj=1.0,flag=false"; 
} 

Вызывается как:

MyMethod(123, "Hello", 1.0, false); 

Я хотел бы вывод, как строки example.

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

Я попытался решить эту проблему с помощью делегата и nameof:

delegate string GetParametersDelegate(params object[] parameters); 

static GetParametersDelegate GetParametersFunc = (parameters) => 
{ 
    return string.Join(",", parameters 
     .Select(parameter => nameof(parameter) + "=" + parameter)); 
}; 

Вызывается как:

static void MyMethod(int i, string str, object obj, bool flag) 
{ 
    string notTheResultIWant = GetParameters(i, str, obj, flag); 
    // notTheResultIWant = "parameter=123,parameter=Hello,parameter=1.0,parameter=false" 
} 

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

Является ли то, что я пытаюсь сделать, даже достичь? Или я могу подойти к этой проблеме другим способом?

+0

Как о создании класса со всеми этими параметрами и прохождения это вместо этого. Таким образом вы можете «захватить» имена параметров в конструкторе и повторно использовать их везде. – i3arnon

+0

Я только что уточнил в вопросе, но есть много разных сигнатур методов - я могу видеть, что вы предлагаете, и на самом деле интересно, я посмотрю на него. Моя единственная забота - это экспоненциальный рост этого класса! – TVOHM

+0

Помогает ли вам этот вопрос? http://stackoverflow.com/questions/14489799/how-to-write-a-custom-poco-serializer-deserializer – devuxer

ответ

2

Одно решение, которое я придумал становится ParameterInfo [] вызываемого метода через его MethodInfo:

delegate string GetParametersDelegate(Delegate method, params object[] parameters); 

static GetParametersDelegate GetParametersFunc = (method, parameters) => 
{ 
    var paramNames = method.Method.GetParameters().Select(pInfo => pInfo.Name); 
    return 
     paramNames.Select((name, index) => $"{name}={parameters[index]?.ToString() ?? "null"}") 
      .Aggregate((a, b) => $"{a},{b}"); 
}; 

Вы можете позвонить:

static void MyMethod(int i, string str, object obj, bool flag) 
{ 
    var method = (Action<int, string, object, bool>)MyMethod; 
    var notTheResultIWant = GetParametersFunc(method, i, str, obj, flag); 
} 
+0

Вы не должны использовать '_' в качестве имени параметра, если вы действительно собираетесь использовать этот параметр. – svick

+0

thx. В ответ следует избегать бессмысленного названия. Отредактировал мой ответ. – deyu