0

我有一个ClassName字符串。我创建了List对象的反射:

Type objectType = Type.GetType(ClassName);
var listObjectType = typeof(List<>);
var constructedListObjectType = listObjectType.MakeGenericType(objectType);
object listObject = Activator.CreateInstance(constructedListObjectType);

现在我listObjectIQueryable<ClassName>不是List<ClassName>

4

3 回答 3

2

不清楚你想做什么,但你要求了一些东西,你会得到你所要求的。

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);

有两个重载Queryable.AsQueryable。一个需要 aIEnumerable<T>并返回对应IQueryable<>的 ,另一个需要 a IEnumerable,检查它实际上是 aIEnumerable<T>并返回 aIQueryable<T>向下转换为IQueryable。我正在使用第二个。

于 2018-07-05T09:53:00.813 回答
1

这个辅助方法应该做你想做的事。在 CreateList 中,您可以使用强类型列表做您喜欢的事情。 GetQuerable将可查询的演员作为对象返回。

显然要确保你有正确的用法,这样才能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();
    }
}

使用:

var listObject  = Helper.GetQuerable("System.Int32");
于 2018-07-05T10:02:30.310 回答
0

这对你有用吗?

    [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 { }

编辑:在 xonos 发表评论后,将代码修复为不会误导

于 2018-07-05T09:54:26.033 回答