【问题标题】:casting a list<baseclass> to a list<derivedclass>将 list<baseclass> 转换为 list<derivedclass>
【发布时间】:2013-05-30 10:28:19
【问题描述】:

我有许多类都继承自一个基类 - 实际上它只是一个接口的包装器,以允许序列化:

public abstract class VoucherRuleBase : IRule{
    public abstract bool Save(int nodeID);
}

public class ActiveDateRule : VoucherRuleBase{
   public DateTime ActiveDateRuleProperty{get;set;}
  ...etc
}

然后我有一个List&lt;VoucherRuleBase&gt;,其中包含许多ActiveDateRule 对象或许多其他派生类。该列表总是充满相同的类型,即。所有 ActiveDateRules 或其他派生类之一。

我需要将列表转换/转换为列表,因为我正在尝试将列表绑定到网格,但由于网格只能看到基类,它无法找到任何属性。在运行时.NET 知道“真实”类型,只是在编译时我无法将其转换。这是因为它根本不可能 - 在每个派生类上没有一些构造函数来进行转换吗?

我在这里搜索过,确实有其他类似的问题,但我对这些解决方案没有任何运气..

任何帮助都非常感谢.. 谢谢

【问题讨论】:

    标签: c# .net casting generic-list


    【解决方案1】:

    你试过myList.Cast&lt;BaseClass&gt;吗?

    【讨论】:

    • 很抱歉,它正在将列表传递给尚未重新编译并设置为基类类型的控件.. doh!两者: .OfType() 和 .Cast() 都有效..
    【解决方案2】:

    尝试使用as

    List<VoucherRuleBase> voucherRules = new List<VoucherRuleBase>();
    var activeDateRules = voucherRules.Select(x => x as ActiveDateRule);
    

    您不会以这种方式进行隐式转换,您可以通过使用Where 和过滤不是null 的类型来过滤出对象。

    var activeDateRules = voucherRules.Select(x => x as ActiveDateRule).Where(x => x != null);
    

    【讨论】:

      【解决方案3】:

      这里的 baseClasses 是您的基类列表。 DerivedClass1 是您的派生类。

      var derivedClasses = baseClasses.Where(item => item.GetType() == typeof(DerivedClass1)).ToList();
      

      【讨论】:

        猜你喜欢
        • 2010-12-21
        • 1970-01-01
        • 2013-06-02
        相关资源
        最近更新 更多