【发布时间】:2012-01-26 20:07:21
【问题描述】:
我有一个带有对象的 ICollection:
private ObservableCollection<ViewItem> items;
viewItems 没有属性。数据将通过带有
的索引访问public object this[int index] {
get{ .... }
set {....}
}
我有一个通用的过滤类。具有属性的 linq 可以正常工作。我使用(仅重要代码):
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 是属性名称。
但我在另一个集合中也有对象,它只能通过索引访问。所以我有一个 where 字符串,例如:
[0]>10 or [1]="abc"
我没有找到任何解决方案。我能找到的唯一提示是使用:
new(it([idx] as Type)
其中idx 是元素索引,Type 是该元素的类型
例如
[0]>10 --> new(it[0] as object)>10
但我得到的错误是:
{"运算符 '=' 与操作数类型 'DynamicClass1' 和 'Int32' 不兼容"}
在我的过滤器中使用字符串,例如:
new(it[0] as object)>"10"
比错误是:
{"运算符 '=' 与操作数类型 'DynamicClass1' 和 'string' 不兼容"}
那么 - 我该如何解决这个问题。因为这是一个通用的过滤器类,所以我也不知道类型。所以在 as 语句中我只能使用 object 或类似的东西。
我希望任何人都可以帮助我。也许 C# 4.0 的 dynamic 关键字会有所帮助?? 顺便说一句,一种解决方法是使用索引器在每个类中实现一个包装器,但这将是很多愚蠢的工作。这是一个真正的程序员不喜欢的东西;)。我相信有一个解决方案!
【问题讨论】:
-
请查看this 并阅读更新!
标签: c# casting dynamic-linq