Я скажу, что dynamic-linq
недостаточно силен, чтобы делать такие вещи. Он ищет методы только в заданных объектах и некоторых специальных классах: Math
, Convert
, различных базовых типах (int
, float
, string
, ...), Guid
, Timespan
, DateTime
Список этих типов хорошо виден, если вы используете ilspy/reflector в файле. Они в System.Linq.Dynamic.ExpressionParser.predefinedTypes
.
Понятно, что я могу ошибаться, но это работает: .Select("Guid.NewGuid().ToString()").Cast<string>().ToArray()
показывая, что вполне вероятно, что это «правильный» список.
Здесь есть статья о том, как изменить Dynamic LINQ, если вам интересно http://www.krizzcode.com/2012/01/extending-dynamiclinq-language.html
Так вот, умный человек взял бы источник динамического линка и просто расширил бы этот массив... Но здесь нет умных людей... Есть только программисты, которые хотят крови! Кровь, но особенно внутренности!
var type = typeof(DynamicQueryable).Assembly.GetType("System.Linq.Dynamic.ExpressionParser");
FieldInfo field = type.GetField("predefinedTypes", BindingFlags.Static | BindingFlags.NonPublic);
Type[] predefinedTypes = (Type[])field.GetValue(null);
Array.Resize(ref predefinedTypes, predefinedTypes.Length + 1);
predefinedTypes[predefinedTypes.Length - 1] = typeof(A); // Your type
field.SetValue(null, predefinedTypes);
Сделайте это (с нужными вам типами) ПЕРЕД первым вызовом Dynamic Linq (поскольку после первого вызова методы/свойства этих типов кэшируются)
Объяснение: мы используем отражение, чтобы добавить наши объекты в этот «специальный список».
person
xanatos
schedule
19.08.2013
Enumerable.Select
? - person Bob.   schedule 19.08.2013