C# 实例化IQueryable<&燃气轮机;从参照选择的类型
我有一个C# 实例化IQueryable<&燃气轮机;从参照选择的类型,c#,C#,我有一个ClassName字符串。我创建了一个对象的列表: Type objectType = Type.GetType(ClassName); var listObjectType = typeof(List<>); var constructedListObjectType = listObjectType.MakeGenericType(objectType); object listObject = Activator.CreateInstance(constructedLi
ClassName
字符串。我创建了一个对象的列表:
Type objectType = Type.GetType(ClassName);
var listObjectType = typeof(List<>);
var constructedListObjectType = listObjectType.MakeGenericType(objectType);
object listObject = Activator.CreateInstance(constructedListObjectType);
Type objectType=Type.GetType(ClassName);
var listObjectType=typeof(列表);
var constructedListObjectType=listObjectType.MakeGenericType(objectType);
object listObject=Activator.CreateInstance(constructedListObjectType);
现在,我希望
listObject
成为IQueryable
而不是List
不清楚你想做什么,但是你要求了什么,你就会得到你想要的
string className = "System.String";
Type type = Type.GetType(className);
var listType = typeof(List<>).MakeGenericType(type);
// This is a List<type> but it is easier to handle it through
// its non-generic IEnumerable interface
var list = (IEnumerable)Activator.CreateInstance(listType);
// Note that in truth this will return a IQueryable<type>
IQueryable queryable = Queryable.AsQueryable(list);
string className=“System.string”;
Type Type=Type.GetType(类名);
var listType=typeof(列表)。MakeGenericType(类型);
//这是一个列表,但更容易处理
//它的非泛型IEnumerable接口
var list=(IEnumerable)Activator.CreateInstance(listType);
//请注意,实际上这将返回一个IQueryable
IQueryable queryable=queryable.AsQueryable(列表);
Queryable.AsQueryable
有两个重载。一个需要IEnumerable
并返回相应的IQueryable
,另一个需要IEnumerable
,检查它是否确实是IEnumerable
,并返回向下转换为IQueryable
的IQueryable。我用的是第二个。不清楚你想做什么,但你要求了什么,你会得到你要求的
string className = "System.String";
Type type = Type.GetType(className);
var listType = typeof(List<>).MakeGenericType(type);
// This is a List<type> but it is easier to handle it through
// its non-generic IEnumerable interface
var list = (IEnumerable)Activator.CreateInstance(listType);
// Note that in truth this will return a IQueryable<type>
IQueryable queryable = Queryable.AsQueryable(list);
string className=“System.string”;
Type Type=Type.GetType(类名);
var listType=typeof(列表)。MakeGenericType(类型);
//这是一个列表,但更容易处理
//它的非泛型IEnumerable接口
var list=(IEnumerable)Activator.CreateInstance(listType);
//请注意,实际上这将返回一个IQueryable
IQueryable queryable=queryable.AsQueryable(列表);
Queryable.AsQueryable
有两个重载。一个需要IEnumerable
并返回相应的IQueryable
,另一个需要IEnumerable
,检查它是否确实是IEnumerable
,并返回向下转换为IQueryable
的IQueryable。我用的是第二个。这对你有用吗
[Fact]
public void Test()
{
var listGenericParameter = typeof(ClassName);
var listObjectType = typeof(List<>);
var constructedListObjectType = listObjectType.MakeGenericType(listGenericParameter);
var listInstance = Activator.CreateInstance(constructedListObjectType);
var asQueryableMethod = typeof(Queryable).GetMethod(nameof(Queryable.AsQueryable), new[] { typeof(IEnumerable) }) ??
throw new InvalidOperationException($"Could not find method AsQueryable() on type {nameof(Queryable)}");
var listAsQueryable = asQueryableMethod.Invoke(null, new [] { listInstance });
// method.Invoke('method owner instance', 'method args')
// first arg is null because AsQueryable() is extension method = static
// => there is no instance "owning" the method (just an owner type)
(listAsQueryable is IQueryable<ClassName>).Should().BeTrue();
}
public class ClassName { }
[事实]
公开无效测试()
{
var listGenericParameter=typeof(ClassName);
var listObjectType=typeof(列表);
var constructedListObjectType=listObjectType.MakeGenericType(listGenericParameter);
var listInstance=Activator.CreateInstance(constructedListObjectType);
var asQueryableMethod=typeof(Queryable).GetMethod(nameof(Queryable.AsQueryable),new[]{typeof(IEnumerable)})??
抛出新的InvalidOperationException($”在类型{nameof(Queryable)}上找不到方法AsQueryable());
var listAsQueryable=asQueryableMethod.Invoke(null,new[]{listInstance});
//Invoke('方法所有者实例','方法参数')
//第一个参数为null,因为AsQueryable()是extension method=static
//=>没有实例“拥有”该方法(只有所有者类型)
(listAsQueryable是IQueryable);
}
公共类类名{}
编辑:修正了代码的错误,在xonos发表评论后,这对你有用吗
[Fact]
public void Test()
{
var listGenericParameter = typeof(ClassName);
var listObjectType = typeof(List<>);
var constructedListObjectType = listObjectType.MakeGenericType(listGenericParameter);
var listInstance = Activator.CreateInstance(constructedListObjectType);
var asQueryableMethod = typeof(Queryable).GetMethod(nameof(Queryable.AsQueryable), new[] { typeof(IEnumerable) }) ??
throw new InvalidOperationException($"Could not find method AsQueryable() on type {nameof(Queryable)}");
var listAsQueryable = asQueryableMethod.Invoke(null, new [] { listInstance });
// method.Invoke('method owner instance', 'method args')
// first arg is null because AsQueryable() is extension method = static
// => there is no instance "owning" the method (just an owner type)
(listAsQueryable is IQueryable<ClassName>).Should().BeTrue();
}
public class ClassName { }
[事实]
公开无效测试()
{
var listGenericParameter=typeof(ClassName);
var listObjectType=typeof(列表);
var constructedListObjectType=listObjectType.MakeGenericType(listGenericParameter);
var listInstance=Activator.CreateInstance(constructedListObjectType);
var asQueryableMethod=typeof(Queryable).GetMethod(nameof(Queryable.AsQueryable),new[]{typeof(IEnumerable)})??
抛出新的InvalidOperationException($”在类型{nameof(Queryable)}上找不到方法AsQueryable());
var listAsQueryable=asQueryableMethod.Invoke(null,new[]{listInstance});
//Invoke('方法所有者实例','方法参数')
//第一个参数为null,因为AsQueryable()是extension method=static
//=>没有实例“拥有”该方法(只有所有者类型)
(listAsQueryable是IQueryable);
}
公共类类名{}
编辑:修复了代码不被误读的问题,在xonos的注释之后,这个助手方法应该做你想做的事情。在CreateList中,您可以使用强类型列表执行任何操作getqueryable
将可查询强制转换作为对象返回
显然,要确保使用正确,以便AsQuerable()
正常工作
public static class Helper
{
public static object GetQueryable(string type) {
var method = typeof(Helper).GetMethod(nameof(CreateList));
return method.MakeGenericMethod(Type.GetType(type)).Invoke(null, new object[0]);
}
public static IQueryable<T> CreateList<T>()
{
return new List<T>().AsQueryable();
}
}
这个助手方法应该做你想做的事情。在CreateList中,您可以使用强类型列表执行任何操作getqueryable
将可查询强制转换作为对象返回
显然,要确保使用正确,以便AsQuerable()
正常工作
public static class Helper
{
public static object GetQueryable(string type) {
var method = typeof(Helper).GetMethod(nameof(CreateList));
return method.MakeGenericMethod(Type.GetType(type)).Invoke(null, new object[0]);
}
public static IQueryable<T> CreateList<T>()
{
return new List<T>().AsQueryable();
}
}
最简单的选择是调用Enumerable.AsQueryable((动态)listObject)
。但是现在还不清楚你接下来要做什么-你确定基于列表的IQueryable
真的能实现你更大的目标吗?您想要实现什么?列表已经是IEnumerable
,可以与LINQ一起使用。为什么要将其转换为IQueryable
?如果有一个有效的原因,您可以简单地对其调用Queryable.AsQueryable()
。顺便说一句,您不能实例化IQueryable
。这是一个界面。您可以使用带有LINQ的列表
,无需任何修改。或者,您可以做什么,并在其周围包装一个EnumerableQuery
。或者只需使用对象作为参数调用Queryable.AsQueryable()
,其原因是通过InvokMember方法获取IQueryable返回值。但在执行Queryable.AsQueryable()时,我得到了System.Reflection.TargetException:'对象确实如此