2012-06-19 3 views
0

У меня есть Func<T, string>, что я хочу преобразовать в Func<dynamic, string>. Является ли это возможным?Есть ли способ конвертировать из Func <T, string> в Func <dynamic, string>?

+1

Если у вас есть 'Func ' то, что функ ожидает значение типа 'Т *. Вы можете, конечно, обернуть вокруг себя 'Func ', но он будет терпеть неудачу во время выполнения, если аргумент 'dynamic' не является экземпляром' T'. И без 'Func ', являясь деревом выражений, нет возможности разложить его и повторно собрать с помощью динамического аргумента. –

+0

Хорошие ответы и комментарии от всех. Ответ прост, как вы видите ниже, и я просто устал видеть это. –

ответ

6

Здесь вы идете. Просто нужно решить, что вы хотите делать, если динамическое значение не типа T:

public Func<dynamic, string> ConvertToDynamicFunc<T>(Func<T, string> typedFunc) 
{ 
    Func<dynamic, string> dynamicFunc = (input) => 
    { 
     if (input is T) 
      return typedFunc((T)input); 

     return null; //or throw? 
    }; 

    return dynamicFunc; 
} 

Func<int, string> typedFunc = (input) => input.ToString(); 
Func<dynamic, string> dynamicFunc = ConvertToDynamicFunc(typedFunc); 
System.Console.WriteLine(dynamicFunc(10));//outputs "10"; 
System.Console.WriteLine(dynamicFunc(10.5));//outputs null since a double isn't an int (type T) or throw if you prefer; 
4

Sure:

Func<T, string> input = ... 
Func<dynamic, string> output = x => input(x); 

Конечно, если выполнить делегат с несовместимым типом, вы получите RuntimeBinderException.

+0

Несомненно, но будет работать во время выполнения, если вход в 'output' не' T'. (даже если динамический аргумент утка набрал те же элементы) Хотя, по общему признанию, это лучшее, что вы можете сделать. –

+0

@KirkWoll: Конечно, но если вы хотите использовать динамику в первую очередь, вы, очевидно, оценили риск и пошли в любом случае. – Ani

+0

Что я имею в виду, если вы сначала пишете реализацию на основе динамических систем, например 'Func foo = x => x.SomeMethod();' и затем сравниваете это с тем, что вы получаете при использовании вашей техники, там является существенной разницей в эффекте, когда ваша техника значительно менее мощна, чем оригинал. Просто подумал, что стоит упомянуть. –

Смежные вопросы