У меня есть ICollection с объектами:
private ObservableCollection<ViewItem> items;
ViewItems не имеет свойств.Доступ к данным будет осуществляться через индекс с
public object this[int index] {
get{ .... }
set {....}
}
. У меня есть общий класс для фильтрации.Линк с свойствами будет работать нормально.Я использую (только важный код):
Queryable = CreateQueryable((IEnumerable<object>)mItemsSource.SourceCollection, ItemType);
mQuery = Queryable.Where(filterString).Cast<object>();
ilteredCollection = mQuery.ToList();
с:
private static IQueryable CreateQueryable(IEnumerable<object> collection, Type itemType)
{
if (itemType == null) return null;
var queryableList = collection.AsQueryable();
return queryableList.Provider.CreateQuery(
Expression.Call(
typeof(Queryable), "Cast",
new Type[] { itemType },
queryableList.Expression));
}
Так что я могу использовать строку фильтра, например: Id>10
или Name="abc"
, где Id
иName
- это имена свойств.
Но у меня есть объект в другой коллекции, доступ к которому возможен только через индекс.поэтому у меня есть строка где, например:
[0]>10 or [1]="abc"
Я не нашел никакого решения.Единственный совет, который я могу найти, это использовать:
new(it([idx] as Type)
, где idx
- индекс элемента, а Type
- тип этого элемента
например,
[0]>10 --> new(it[0] as object)>10
Но затем я получаю сообщение об ошибке:
{"Operator" = 'несовместим с типами операндов' DynamicClass1 'и' Int32 '"}
Использование строки вмой фильтр вроде:
new(it[0] as object)>"10"
, чем ошибка:
{"Operator" = 'несовместим с типами операндов' DynamicClass1 'и' string '"}
Итак - как мне решить эту проблему.Поскольку это общий класс фильтров, я также не знаю тип .Поэтому в выражении как я могу использовать только объект или что-то подобное.
Я надеюсь, что кто-нибудь может мне помочь.Возможно, ключевое слово dynamic в C # 4.0 поможет ??Кстати, обходной путь будет заключаться в том, чтобы создать в каждом классе оболочку с индексатором, но это будет много глупой работы.И это то, что настоящий программист не любит;).Я уверен, что есть решение!