将对象转换为Linq表达式中的泛型接口类型

本文关键字:泛型 接口类型 表达式 Linq 对象 转换 | 更新日期: 2023-09-27 18:17:04

这是一个与上一个问题相关的更一般的问题:

https://stackoverflow.com/questions/25193086/jsonserviceclient-call-from-list-of-generic-objects

我有几十个类,它们都实现了IReturn接口。例如:
public class GetDataRequest : IReturn<GetDataResponse>
{
    public string SomeQueryString { get; set; }
}

在另一个程序(用于测试)中,我使用linq从外部程序集中选择这些类型,然后创建一个实例并将其添加到对象列表中:

var DtoClasses = (from t in assembly.GetTypes()
                    where (typeof(IReturn)).IsAssignableFrom(t)
                    select Activator.CreateInstance(t)).ToList();

从对象列表中选择需要测试的类。问题是,这些对象将被输入的方法(我无法控制)具有IReturn的接口约束。尽管我所有的对象实际上都实现了那个接口,但似乎没有办法向编译器暗示这一点。

我的问题是我将如何采取通用对象,并将其转换成一个实现接口?假设所讨论的对象确实已经实现了接口,即使它的当前状态没有暗示它。

谢谢

将对象转换为Linq表达式中的泛型接口类型

IEnumerable上调用.Cast<IReturn>:

List<IReturn> DtoClasses = 
    (from t in assembly.GetTypes()
     where (typeof(IReturn)).IsAssignableFrom(t)
     select Activator.CreateInstance(t))
        .Cast<IReturn>()
        .ToList();