【问题标题】:is it possible to pass type as a string in LINQ query? [closed]是否可以在 LINQ 查询中将类型作为字符串传递? [关闭]
【发布时间】:2021-05-03 19:18:45
【问题描述】:

我有 4 节课:
人 - 抽象类
Student - 从 Person 继承的类
Teacher - 从 Person 继承的类
PersonProvider - 创建 list<A> 的静态类,此列表保留 Student 和 Teacher 的对象

现在,问题是,我有下面的查询向用户显示他的选择是他必须在学生或教师之间进行选择,但是如何将他选择的内容传递给下一个查询(所以列出所有学生或所有教师)?我不能只从控制台读取并将其传递给我的查询,因为 typeOf()getType() 不适用于字符串:)。

以下查询返回列表中的不同类型,但我不知道如何进一步处理:

var listOfPersons = PersonProvider
  .AvailablePersons
  .Where(p => p.GetType().BaseType == typeof(Person))
  .GroupBy(p => p.GetType().Name)
  .Select(g => g.First())
  .ToList();

foreach (var item in listOfPersons )
{
    Console.WriteLine(item.GetType().Name);
}

这会返回:

Student
Techaer

现在用户应该在控制台中输入“学生”或老师,这样我就可以将它传递给我不知道如何构建的下一个查询。我正在考虑使用**Func<T, bool> predicate** 的通用扩展方法,但我不确定。

【问题讨论】:

  • 正确地说你的意思是,APerson 类,BStudentCTeacher
  • 不是一个很好的问题,是吗?也许您要问的是如何从字符串名称创建类型的实例?如果是这样,请看这里:stackoverflow.com/questions/7598088/…
  • 我不明白这个问题。如果用户可以在StudentTeacher 之间进行选择,您就知道它指的是什么类型。所以不需要解释字符串,switch 就足够了。
  • 对不起,我正在编辑它,我做了一些错别字。我保证下一个类型我会做得更好。我发现(在朋友的帮助下)我可以使用 GetType().Name ...
  • 旁注:.Where(p => p.GetType().BaseType == typeof(Person))可以写成.OfType<Person>()

标签: c# linq generics .net-core lambda


【解决方案1】:

您可以尝试将输入转换为Type 并在静态列表中搜索属于同一类型的实例。

示例:

string input = "Teacher";
Type inputType = Assembly.GetExecutingAssembly().GetTypes().FirstOrDefault(t => t.Name == input);

// validate if the user input is correct.
if (inputType == null)
    throw new ArgumentOutOfRangeException(nameof(input), "It must be Student or Teacher.");
    

var listOfPersons = PersonProvider.AvailablePersons.Where(p => p.GetType() == inputType)                                
                                  .ToList();

// print the names
foreach (var item in listOfPersons)
    Console.WriteLine(item.Name);

查看工作示例: https://dotnetfiddle.net/vL6ruv

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 2016-11-02
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    相关资源
    最近更新 更多