我有一個BindingSource
其DataSource
(定義爲一個對象)可以在運行時是任何類型IEnumerable
類(如IList<Foo>
)。我需要將其轉換爲IQueryable<T>
,這樣我可以在一個通用的擴展傳遞:轉換IEnumerable的<T>到的IQueryable <T>其中T是未知
IOrderedQueryable<TEntity> OrderUsingSortExpression<TEntity>(this IQueryable<TEntity> source, string sortExpression) where TEntity : class
到目前爲止,我有這樣的:
string order = "Message ASC";
Type thetype = bsTotalBindingSource.DataSource.GetType().GetGenericArguments()[0];
IEnumerable<object> totalDataSource = ((IEnumerable<object>)(bsTotalBindingSource.DataSource));
//Blowing up on this next line with 'System.Linq.Queryable is not a GenericTypeDefinition. MakeGenericType may only be called on a type for which Type.IsGenericTypeDefinition is true.'
MethodInfo asQueryableMethod = typeof(Queryable).MakeGenericType(thetype).GetMethod("AsQueryable", BindingFlags.Static | BindingFlags.Public, null, new[] { typeof(IQueryable<>) }, null);
MethodInfo genericAsQueryableMethod = asQueryableMethod.MakeGenericMethod(thetype);
MethodInfo orderUsingSortExpressionMethod = GetType().GetMethod("OrderUsingSortExpression");
MethodInfo genericUsingSortExpressionMethod = orderUsingSortExpressionMethod.MakeGenericMethod(thetype);
bsTotalBindingSource.DataSource = genericUsingSortExpressionMethod.Invoke(this, new object[] { genericAsQueryableMethod.Invoke(totalDataSource, null), order });
正如你所看到的,最終目標在這裏爲了能夠從DataSource中獲取某些東西,請獲取其運行時類型IEnumerable<T>
,其中T
可以是任何內容,然後調用AsQueryable<T>
,以便它可以傳遞到接受IQueryable<T>
的函數中。
編輯 經過深入挖掘,找到具體的方法,我正在尋找我已經得到了一些問題。它現在看起來像這樣:
string order = "Message ASC";
Type thetype = bsTotalBindingSource.DataSource.GetType().GetGenericArguments()[0];
//Returns the AsQueryable<> method I am looking for
MethodInfo asQueryableMethod = typeof(Queryable).MakeGenericType(thetype).GetMethods()[1];
MethodInfo genericAsQueryableMethod = asQueryableMethod.MakeGenericMethod(thetype);
MethodInfo orderUsingSortExpressionMethod = typeof(SortExtension)GetType().GetMethods()[0];
MethodInfo genericUsingSortExpressionMethod = orderUsingSortExpressionMethod.MakeGenericMethod(thetype);
bsTotalBindingSource.DataSource = genericUsingSortExpressionMethod.Invoke(this, new object[] { genericAsQueryableMethod
//blows up here with 'Object of type 'System.RuntimeType' cannot be converted to type 'System.Collections.Generic.IEnumerable`1[LogRecordDTO]'.'
.Invoke(bsTotalBindingSource.DataSource, new object[] {thetype}), order });
的問題是,我不知道什麼是TElement,這就是爲什麼我試圖通過反射 –
我想你想失去'MakeGenericType'援引AsQueryable已,爲'Queryable'的確是一個不一般類型。 – Rawling
你可以發佈你的方法和類,因爲它們是我可以建立一個測試應用程序。 –