Вы не можете получить доступ к параметрам по имени, так как вы не можете реально использовать отражение переменных / параметров.У вас могут быть некоторые варианты, если это был IL, но не совсем в C #.Мой совет: измените API, возможно, что-то, включающее либо массив, либо (возможно, лучше) словарь.Подумайте:
public void ExampleMethod(string id, object data,
IDictionary<string,object> args) {
args[id] = data;
}
Не уверен, поможет ли это ... но то, что вы пытаетесь сделать, не очень благоприятно для размышлений.Другой вариант - генерировать этот метод динамически, либо как часть вашего процесса сборки, либо через IL.Либо должно быть в порядке.Таким образом, он может сгенерировать (как C # или (во время выполнения) IL):
public void ExampleMethod(string id, object data,
ref object A, ref object B, ref object C)
{
switch(id) {
case "A": A = data; break;
case "B": B = data; break;
case "C": C = data; break;
default: /* do something */
}
}
Дополнительный подход: типизированный объект: скажем, у вас есть:
public void ExampleMethod(string id, object data, SomeType obj) {...}
где obj
является объектом со свойствами, такими как «A», «B», «C»;тогда вы пытаетесь сгенерировать:
switch(id) {
case "A": obj.A = data; break;
case "B": obj.B = data; break;
case "C": obj.C = data; break;
default: /* do something */
}
, что, конечно, можно сделать с помощью отражения:
var prop = obj.GetType().GetProperty(id);
prop.SetValue(obj, data, null);
или, если производительность критична, что-то вроде fast-member:
var wrapped = ObjectAccessor.Create(obj);
wrapped[id] = data;