Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实例化IQueryable<&燃气轮机;从参照选择的类型_C# - Fatal编程技术网

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:'对象确实如此