У меня есть ситуация, когда у меня есть объект типа «динамический», который является invokable. Я пытаюсь реализовать функцию, которая будет динамически вызывать объект во время выполнения с набором аргументов. Достаточно легко вызвать его, если я знаю, что количество аргументов во время компиляции:Можно ли вызвать динамический объект в C#?
Object StaticInvoke(dynamic func, Object[] args) {
// arguments are explicitly unwrapped and bound to the invokation
// requiring that we know the number at compile time
return func(args[0], args[1], ...);
}
Но это не сделать то, что я хочу, потому что массив арг может быть переменной длины. Я не могу найти способ поддержать произвольное количество аргументов. Самое близкое, что я придумал, это что-то вроде:
static Object Invoke(dynamic func, Object[] args)
{
// not sure what to put here
switch(args.Length)
{
case 0:
return func();
case 1:
return func(args[0]);
case 2:
return func(args[0], args[1]);
...
default:
throw new NotSupportedException();
}
}
Который ограничил бы количество аргументов, которые я мог бы пройти. Думаю, я мог бы жить с этим ограничением, но мне кажется, что то, что я пытаюсь сделать, должно быть возможным.
Я в основном пытаюсь реализовать функцию «применить» в C#. Есть ли более простой способ выполнить то, что я пытаюсь сделать? Я чувствую, что мне не хватает чего-то очевидного.
Почему пользователи вашего кода вызывают 'Invoke' вместо прямого вызова функции func (...)'? –
Я подозреваю, что есть встроенный способ сделать то, что вы пытаетесь сделать, используя отражение, но я не эксперт в этой области. Вместо этого я упомянул, что если вы хотите использовать переменное число аргументов в C#, вы должны посмотреть ключевое слово 'params'. Мое оговорку заключается в том, что я не думаю, что вы действительно хотите 'params', вы хотите вызвать метод с использованием отражения. –
@ M.Babcock: «invoke», который я пытаюсь создать, реализует метод интерфейса, чтобы мы могли работать с новыми динамическими вызовами так же, как мы работаем с «устаревшими» вызовами в старых сценариях, которые мы используем. – MarkPflug