C# 我需要一个Linq IEnumerable<>;。铸造(T型)

C# 我需要一个Linq IEnumerable<>;。铸造(T型),c#,.net,linq,generics,ienumerable,C#,.net,Linq,Generics,Ienumerable,我正在查询一个数据结构,结果类型是IEnumerable(IEntry是一个框架接口),每个条目都有一个data属性(类型为object),该属性对我来说是交互的 我的代码如下所示: var resultList = framework.QueryAllOfType(queryClause.Type) .Select(e => e.Data) .ToList(); deleagte.Dy

我正在查询一个数据结构,结果类型是
IEnumerable
IEntry
是一个框架接口),每个条目都有一个
data
属性(类型为object),该属性对我来说是交互的

我的代码如下所示:

var resultList = framework.QueryAllOfType(queryClause.Type)
                          .Select(e => e.Data)
                          .ToList();
deleagte.DynamicInvoke(new[]{resultList});
void Foo (IEnumerable<SomeType> bar); // if queryClause.Type == typeof(SomeType)
void Foo (IEnumerable<OtherType> bar); // if queryClause.Type == typeof(OtherType)
委托背后的方法如下所示:

var resultList = framework.QueryAllOfType(queryClause.Type)
                          .Select(e => e.Data)
                          .ToList();
deleagte.DynamicInvoke(new[]{resultList});
void Foo (IEnumerable<SomeType> bar); // if queryClause.Type == typeof(SomeType)
void Foo (IEnumerable<OtherType> bar); // if queryClause.Type == typeof(OtherType)
void Foo(IEnumerable bar);//如果querycause.Type==typeof(SomeType)
void Foo(IEnumerable bar);//如果querycause.Type==typeof(OtherType)
我绝对肯定
querycause.Type
SomeType
匹配,当然,.NET框架不是;-)

不幸的是,这意味着
resultList
的类型是
IEnumerable
,尽管其中的所有对象都是正确的类型,但我无法调用委托(异常:
IEnumerable无法转换为IEnumerable

我知道为什么会这样,但解决办法是什么?我需要一些大致如下的东西:

.Select(e=>e.Data).Cast(querycause.Type).ToList()
它应该返回一个
IEnumerable
。在.NET框架中已经有这样的东西了吗?有更好的解决办法吗


重要提示:由于两个答案已经误解了我的意图,我不能将该类型用作泛型参数,因为它仅在运行时已知。因此,所有的
Cast()
选择(e=e as…
等)都不起作用。

尝试以以下方式结束:

.ToList<IEntry>()
.ToList()
例如,如果您执行以下操作:

.ToList<IEntry>()
int[]text={01,2,3,4,5}

List<string> list = text.Select(x => x.ToString()).ToList<string>();
List List=text.Select(x=>x.ToString()).ToList();

您可以使用反射调用
Cast

var method = typeof(Enumerable).GetMethod("Cast").MakeGenericMethod(queryClause.Type);
IEnumerable<object> cSeq = (IEnumerable<object>)method.Invoke(null, new object[] { resultList });

deleagte.DynamicInvoke(new[]{ cSeq });
var method=typeof(可枚举).GetMethod(“Cast”).MakeGenericMethod(querycause.Type);
IEnumerable cSeq=(IEnumerable)方法。调用(null,新对象[]{resultList});
DynamicInvoke(新[]{cSeq});

根据您的反馈,并使用其他答案,我创建了一个
ToListOfType()
扩展方法,该方法可以满足您的需要

public static class EnumerableExtensions
{
    private static readonly Type _enumerableType = typeof(Enumerable);

    public static IEnumerable CastAsType(this IEnumerable source, Type targetType)
    {
        var castMethod = _enumerableType.GetMethod("Cast").MakeGenericMethod(targetType);

        return (IEnumerable)castMethod.Invoke(null, new object[] { source });
    } 

    public static IList ToListOfType(this IEnumerable source, Type targetType)
    {
        var enumerable = CastAsType(source, targetType);

        var listMethod = _enumerableType.GetMethod("ToList").MakeGenericMethod(targetType);

        return (IList)listMethod.Invoke(null, new object[] { enumerable });
    } 
}

如果您只是将
ToList()
调用替换为
ToListOfType(querycause.Type)
,那么这应该适用于您的委托。我实现了
CastAsType
ToListOfType
方法,这样,如果您选择,就可以不迭代集合。我要提醒未来的读者,这些只在像您这样的情况下有用,您将结果动态传递给代理-在所有其他情况下,
Cast
操作将是首选操作。

我更新了我的问题,这对我来说是不可能的解决方案。好的!真对不起,伙计!;)我不明白:您有一个委托不接受IEnumerable,但需要另一个类型,但您声称该类型不是编译时类型?代理是怎么知道的?当然有更多的代理-都有不同的参数类型(这就是为什么我需要DynamicVoke来调用它们)。好的,谢谢。与此同时,我自己也找到了解决办法。希望.NET framework中已经存在一些内容。这不起作用,因为在调用
Cast()
后,需要再次调用
ToList()
才能调用委托,委托将再次返回一个
IList
。必须将Cast/ToList组合成一个调用,使用
MakeGenericMethod
关键字,我现在在另一个线程中找到了这个答案:这似乎是一个有效的解决方案。@D.R.-您的问题是,代理使用的是
IEnumerable
而不是
列表,所以这应该是有效的。如果您需要传递一个
列表
,那么您必须使用与
Cast
相同的方式使用反射来调用
ToList
。是的,我会接受您的答案。只是将链接留在这里,因为可能其他人也会被它绊倒。这对ToList()的行为没有任何影响
e.Data
已经是
querycause.type
类型,但是编译器不知道,这就是为什么
.ToList()
返回一个
IList
@D.R.-用扩展方法更新,该扩展方法集成了接受的答案,而不需要您在注释中引用的答案所需的额外的每类方法。