我需要能夠得到類似的東西以下工作:IQueryable的OfType <T>其中T是一個運行時類型
Type type = ??? // something decided at runtime with .GetType or typeof;
object[] entityList = context.Resources.OfType<type>().ToList();
這可能嗎?我可以使用.NET 4,如果有什麼新的允許的話。
我需要能夠得到類似的東西以下工作:IQueryable的OfType <T>其中T是一個運行時類型
Type type = ??? // something decided at runtime with .GetType or typeof;
object[] entityList = context.Resources.OfType<type>().ToList();
這可能嗎?我可以使用.NET 4,如果有什麼新的允許的話。
您可以通過反射調用它:
MethodInfo method = typeof(Queryable).GetMethod("OfType");
MethodInfo generic = method.MakeGenericMethod(new Type[]{ type });
// Use .NET 4 covariance
var result = (IEnumerable<object>) generic.Invoke
(null, new object[] { context.Resources });
object[] array = result.ToArray();
另一種方法是寫自己的OfTypeAndToArray
泛型方法做它兩個位,但上面的應該工作。
看起來你需要在這裏使用反射...
public static IEnumerable<object> DyamicOfType<T>(
this IQueryable<T> input, Type type)
{
var ofType = typeof(Queryable).GetMethod("OfType",
BindingFlags.Static | BindingFlags.Public);
var ofTypeT = ofType.MakeGenericMethod(type);
return (IEnumerable<object>) ofTypeT.Invoke(null, new object[] { input });
}
Type type = // ...;
var entityList = context.Resources.DynamicOfType(type).ToList();
感謝您的幫助! – Tablet 2010-09-08 22:36:41
怎麼樣......
public static IList OfTypeToList(this IEnumerable source, Type type)
{
if (type == null)
throw new ArgumentNullException(nameof(type));
return
(IList) Activator.CreateInstance(
typeof(List<>)
.MakeGenericType(type),
typeof(System.Linq.Enumerable)
.GetMethod(nameof(System.Linq.Enumerable.OfType),
BindingFlags.Static | BindingFlags.Public)
.MakeGenericMethod(type)
.Invoke(null, new object[] { source }));
}
你要問自己'爲什麼?'小心。 – leppie 2010-09-08 16:17:47
它必須是IQueryable嗎?從你的例子來看,IEnumerable似乎就足夠了。 – 2010-09-08 16:18:37
@leppie我不明白你的觀點。 – Tablet 2010-09-08 22:38:15