У меня есть Func<T, string>
, что я хочу преобразовать в Func<dynamic, string>
. Является ли это возможным?Есть ли способ конвертировать из Func <T, string> в Func <dynamic, string>?
ответ
Здесь вы идете. Просто нужно решить, что вы хотите делать, если динамическое значение не типа 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;
Sure:
Func<T, string> input = ...
Func<dynamic, string> output = x => input(x);
Конечно, если выполнить делегат с несовместимым типом, вы получите RuntimeBinderException
.
Несомненно, но будет работать во время выполнения, если вход в 'output' не' T'. (даже если динамический аргумент утка набрал те же элементы) Хотя, по общему признанию, это лучшее, что вы можете сделать. –
@KirkWoll: Конечно, но если вы хотите использовать динамику в первую очередь, вы, очевидно, оценили риск и пошли в любом случае. – Ani
Что я имею в виду, если вы сначала пишете реализацию на основе динамических систем, например 'Func
- 1. Как конвертировать Func <T,bool> в Expression <Func<T,bool>>
- 2. Func <T>() vs Func <T> .Invoke()
- 3. C# - Как преобразовать Func <T, bool> в Func <dynamic, bool>?
- 4. Получить Func <T> и выражение <Func<T>> от одного параметра?
- 5. Как преобразовать Func <T, object> в Func <dynamic, object>?
- 6. Рефакторинг Func <T> в выражение <Func<T>>
- 7. Expression <Func <T, bool>> из F # FUNC в LINQ
- 8. Почему Func <T> неоднозначный с Func <IEnumerable <T>>?
- 9. Generic распаковка выражения <Func <T, object>> в Expression <Func <T, TResult>>
- 10. Moq framework Func <T,T>
- 11. Преобразование выражения <Func <T, bool?>> выражение <Func <T, bool>>
- 12. Инкапсулирующее действие <T> и Func <T>?
- 13. не удается преобразовать из Func <T,T,T> в Func <T,T,T>
- 14. ConcurrentDictionary - Преобразование addValueFactory (Func <string, T, T>) в updateValueFactory (Func <string, T, T>)?
- 15. LINQ-to-SQL: Преобразование Func <T, T, bool> в выражение <Func <T, T, bool>>
- 16. Func <T> с параметром out
- 17. Создать Dynamic Func <T, TResult> от Object
- 18. Преобразовать Expression <Func <T,T,bool>> для выражения <Func<T,bool>>
- 19. Получение от Func <T, T, bool> + T экземпляр для Expression <Func <T, bool>>
- 20. Есть ли Func <T> .BeginInvoke использует ThreadPool?
- 21. Подробнее о литье Func <T,T> и Expression <Func<T,T>>
- 22. Как бросить Expression <Func <T, DateTime>> в Expression <Func <T, object>>
- 23. Как я могу сделать Func <объект [], выражение <Func<T,bool> >> dynamic?
- 24. Использование нового в Func <T>
- 25. Преобразование Func <Type, объект> выражение Func <T> где T является общим ограничением
- 26. Convert Func <T, string> [] in Func <T, string[]>?
- 27. Выполнение функции доступа члена из Func <ПроизводныйFromT, объект> в Func <T,object>
- 28. Преимущество Func <T> в C#?
- 29. Как преобразовать выражение <Func <T, object>> в выражение <Func <T, bool>>?
- 30. Func <T,TResult> не является Func <T,TResult>
Если у вас есть 'Func' то, что функ ожидает значение типа 'Т *. Вы можете, конечно, обернуть вокруг себя 'Func ', но он будет терпеть неудачу во время выполнения, если аргумент 'dynamic' не является экземпляром' T'. И без 'Func ', являясь деревом выражений, нет возможности разложить его и повторно собрать с помощью динамического аргумента. –
Хорошие ответы и комментарии от всех. Ответ прост, как вы видите ниже, и я просто устал видеть это. –