【问题标题】:Convert a List to a given Type将列表转换为给定类型
【发布时间】:2013-03-25 16:52:33
【问题描述】:

我有以下列表:

public List<EntityBase> PossibleReplacements

我也有一个类型

public Type type;

type 将包含某个继承 EntityBase 的类类型(这就是我的应用程序的工作方式)。 现在我需要将列表 PossibleReplacements 转换为 'type' 类型的列表

类似这样的:

List<type> lijst = PossibleReplacements.Cast<type>();

但这会报错

'ReplacePopupModel.type' is a 'field' but is used like a 'type' 

我还没有找到一个可行的解决方案。

谁能帮帮我?

谢谢。

【问题讨论】:

  • 在调用 Cast 时尝试 typeof(type)。
  • 您不能以类型安全的方式执行此操作,您的类型在编译时是未知的
  • 看起来更像是对泛型缺乏了解。你想用 List 做什么?
  • 我稍微改变了我的应用程序逻辑,并设法使用泛型解决了我的问题。非常感谢大家对类型安全的好建议。

标签: c# list types casting type-conversion


【解决方案1】:

您可以像这样取出与类型匹配的项目:

List<EntityBase> list = PossibleReplacements.Where(e => type.IsAssignableFrom(e.GetType())).ToList();

此列表将仅包含与您在type 中指定的特定类型匹配(或属于其子类)的项目。

但是,您不能强制转换为特定的 List&lt;T&gt; 类型,因为这在编译时是未知的。

如果您尝试提取特定类型的项目在编译时已知,您可以使用:

List<TheType> list = PossibleReplacements.OfType<TheType>().ToList();

【讨论】:

    【解决方案2】:

    您不能使用Cast,因为它在运行时不是类型安全的,您只需使用where 来选择:

    var lijst = PossibleReplacements.Where(t => t.GetType() == type);
    

    【讨论】:

    • 他不想获取类型,OP 想强制转换为给定的类型实例。
    • Convert.ChangeType 将在运行时失败...此外,这不会编译,因为 Select 将从该查询返回 IEnumerable&lt;Object&gt;
    • 它仍然不会编译,你不能在那里List&lt;Type&gt;
    【解决方案3】:

    并非没有反思,也不安全。但是您可以按照 Reed Copsey 的第一个提示检查是否所有条目都可以分配给您的类型,然后使用反射转换方法:

    var type = ...your type...
    
    var cast = typeof(IEnumerable<>).GetMethod("Cast").MakeGenericMethod(type);
    var list = cast.Invoke(PossibleReplacements, null);
    

    变量list 现在是object,但引用了正确类型的列表。由于您不知道您的实际类型,您可能有一些接口来访问列表(需要强制转换)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      相关资源
      最近更新 更多