Прежде всего, вы побеждаете цель статической типизации: в статической типизации весь смысл в том, что во время компиляции вы можете точно сказать, какой тип имеет определенный объект и как таковой компилятор будетпозволяют вам делать определенные вещи.То, что вы ожидаете здесь, это то, что обычно предлагает динамическая типизация, где вы можете просто передать «что-то», а затем вы можете выяснить во время выполнения, как это использовать.
Вы должны действительно переосмыслить это ваше требованиеи посмотрим, не можете ли вы решить эту проблему лучше, статически типизированным способом.
При этом существует несколько уродливый способ сделать это статически нормальным, используя пользовательский тип и некоторые неявные преобразования типов.(что происходит во время компиляции!):
public object GetValue(string name, DynamicFunc func)
{
return func.DynamicInvoke("a", "b");
}
public class DynamicFunc
{
public Func<object> None { get; private set; }
public Func<object, object> One {get; private set;}
public Func<object, object, object> Two { get; private set; }
public object DynamicInvoke(object param1 = null, object param2 = null)
{
if (Two != null)
return Two(param1, param2);
else if (One != null)
return One(param1 ?? param2);
else if (None != null)
return None();
return null;
}
public static implicit operator DynamicFunc(Func<object> func)
=> new DynamicFunc { None = func };
public static implicit operator DynamicFunc(Func<object, object> func)
=> new DynamicFunc { One = func };
public static implicit operator DynamicFunc(Func<object, object, object> func)
=> new DynamicFunc { Two = func };
}
И затем вы можете использовать это так:
var result0 = GetValue("Bob", (Func<object>)(() => { return "Bob Smith"; }));
var result1 = GetValue("Joe", (Func<object, object>)((i) => { return "Joe " + i.ToString(); }));
var result2 = GetValue("Henry", (Func<object, object, object>)((i, e) =>
{
return $"i: {i.ToString()}, e: {e.ToString()}";
}));
Обратите внимание, что вам нужно дать лямбда-выражениям явный тип, так какиначе компилятор не сможет определить тип.
Выглядит ли это хорошо или облегчает понимание?Я так не думаю.Если вы хотите правильную статическую типизацию, просто используйте перегрузку метода здесь.Таким образом, вам также не нужно будет вызывать функцию динамически, что также упрощает ее вызов.