LINQ on System.Object (тип известен только во время выполнения с использованием отражения) - PullRequest
0 голосов
/ 16 августа 2010

У меня есть требование simlar, когда у меня есть 3 основных объекта в модели объектов ADO.NET ... Я строю структуру, в которой на основе входящего корневого элемента XML я должен создать экземпляр конкретного объекта с помощью отражения и установить его свойства..

Но когда дело доходит до дочерних объектов .. Я не могу использовать запросы LINQ для него, так как тип не известен во время разработки.PropertyInfo.GetValue дает мне объект, для которого я не могу выполнять запросы LINQ (даже если я приведу его к IQueryable или IEnumerable).Я даже не могу привести его к типу во время разработки, так как это будет своего рода жесткое кодирование, и я потерплю неудачу в моих общих целях.

Я попытался использовать динамическое ключевое слово ... но на этом тоже я не могу писать запросы LINQ.. выдает сообщение о том, что запросы LINQ не поддерживаются в динамической модели диспетчеризации. !!!

Может кто-то помочь ..

С уважением, Badal

1 Ответ

0 голосов
/ 16 августа 2010

Как и рекомендовал @Yuriy Faktorovich, динамический LINQ может быть вашим лучшим выстрелом.

Другой вариант , который у вас есть, - это динамическое построение деревьев выражений и выполнить свое выражение с помощью отражения.Имейте в виду, что это нелегко и может занять немного времени, чтобы обернуть голову вокруг API выражения, но для простого выражения это не так уж плохо.

Пример: скажем, вы хотите повторить это выражение:

p => p.FirstName == firstName

Вы можете построить дерево выражений следующим образом:

var myType = Type.GetType("Person"); // <-- Find your type based on XML
var firstName = "John";

var param = Expression.Parameter(myType, "p");
var firstNameProperty = Expression.Property(param, "FirstName");
var constantExpression = Expression.Constant(firstName);
var equalsExpression = Expression.Equal(firstNameProperty, constantExpression);

var lambda = Expression.Lambda(equalsExpression, param);

Лямбда будет иметь тип времени выполнения Expression<Func<Person,bool>>, который затем можно будет передать любой реализации IQueryable.

ОБНОВЛЕНИЕ

Затем для динамического вызова некоторого метода на вашем IQueryable вы можете сделать что-то похожее на следующее:

var queryableType = typeof(Queryable);
var whereMethod = queryableType.GetMethod("Where", BindingFlags.Public | BindingFlags.Static);

var parameters = new object[] { query, lambda }; // query is your IQueryable object
var list = whereMethod.Invoke(null, parameters);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...