.net 在反射期间使用LINQ访问底层类型

.net 在反射期间使用LINQ访问底层类型,.net,linq,reflection,.net,Linq,Reflection,我有一个自己的小应用程序,用于实现解决当前问题的方案。我有一个名为ProblemBase的基类,其中包含有关问题的元信息,例如问题的id、名称和描述文本,以及一个解算器函数。然后,每个问题实现都来自这个类 现在实现的列表越来越大,所以我没有手动维护解决方案容器,而是第一次走进reflection land。其思想是在我的程序集中找到从ProblemBase派生的所有类型,并将它们实例化到应用程序的问题枚举中(Problems,在下面的代码中),以便我可以从GUI与它们交互。以下是我当前的实现:

我有一个自己的小应用程序,用于实现解决当前问题的方案。我有一个名为
ProblemBase
的基类,其中包含有关问题的元信息,例如问题的id、名称和描述文本,以及一个解算器函数。然后,每个问题实现都来自这个类

现在实现的列表越来越大,所以我没有手动维护解决方案容器,而是第一次走进reflection land。其思想是在我的程序集中找到从
ProblemBase
派生的所有类型,并将它们实例化到应用程序的问题枚举中(
Problems
,在下面的代码中),以便我可以从GUI与它们交互。以下是我当前的实现:

    private void FindProblemTypes()
    {
        var problemBaseType = typeof(ProblemBase);
        var problemTypes = (from t in Assembly.GetAssembly(problemBaseType).GetTypes()
                            where t != problemBaseType && problemBaseType.IsAssignableFrom(t)
                            select t).ToList();

        Problems = new ObservableCollection<ProblemBase>();
        foreach (var problemType in problemTypes)
        {
            Problems.Add((ProblemBase)Activator.CreateInstance(problemType));
        }

        Problems = new ObservableCollection<ProblemBase>(Problems.OrderBy(t => t.Id));
    }
private void FindProblemTypes()
{
变量problemBaseType=类型(ProblemBase);
var problemTypes=(来自Assembly.GetAssembly(problemBaseType.GetTypes()中的t)
其中t!=problemBaseType&&problemBaseType.IsAssignableFrom(t)
选择t.ToList();
问题=新的ObservableCollection();
foreach(problemTypes中的var problemType)
{
Add((ProblemBase)Activator.CreateInstance(problemType));
}
Problems=新的observeCollection(Problems.OrderBy(t=>t.Id));
}
它在工作,但我想把它清理一下。现在,我首先创建一个派生类型的列表,然后将它们安装到我的集合中,然后创建另一个集合,按照它们的id对类型进行排序。我要做的是直接从第一个LINQ集合创建ObservableCollection。我只想在LINQ语句中添加
orderby t.Id
,但由于类型集合包含
System.type
对象而不是
ProblemBase
对象,因此该属性不可用,并且我无法在LINQ查询中将变量转换为我的基本对象。我假设这是因为我请求的类型信息在编译时是未知的,但是有没有其他方法可以将其视为查询中的
ProblemBase
对象?还是我必须坚持我所拥有的

var problemTypes = (from t in Assembly.GetAssembly(problemBaseType).GetTypes()
    where t != problemBaseType && problemBaseType.IsAssignableFrom(t)
    select (ProblemBase)Activator.CreateInstance(t)).ToList().OrderBy(t => t.Id);
这样行吗?您仍然需要添加范围才能将其放入集合中,但这不会遍历它们,所以这很好。我在LINQ不是最好的,所以你可能想测试一下


我认为您永远无法将“orderby id”塞进原始查询,因为到那时这些项都不会被创建。

这样做了,我忘了我可以直接从Select语句中执行操作。我直接从查询返回的列表中创建了ObservableCollection。谢谢!:)