返回类型为基类型时返回派生类型c#

时间:2015-02-04 17:11:49

标签: c#-4.0 generics interface abstract-class derived-class

我有一个Base抽象类和一个派生类

基础抽象类

public abstract class BaseData: IListingData
    {
        private int? _photos;
        public string DataKey { get; set; }
        public abstract List<Images> Photos { get; set; }
}

派生类

public class DerivedData1 : BaseData
    {
        public override List<Images> Photos
        {
            get
            { return new List<Images>(); } set {}
        }
     }

public class DerivedData2 : BaseData
        {
            public override List<Images> Photos
            {
                get
                { return new List<Images>(); } set {}
            }
         }

我有服务功能:

 public List<ListingData> FilterListings(PredicateHandler predicates)
        {
            //Retrieved from database and based on certain predicates, it will create List of DerivedData1 or DerivedData2

            Return new List<DerivedData1>(); //This is where the ERROR is.
         }

我无法返回派生类型。我尝试了转换,我得到以下相同的编译错误。 无法转换表达式类型&#39; System.Collections.Generic.List&lt; DerivedData1&GT;&#39;返回类型&#39; System.Collections.Generic.List&lt; ListingData&GT;&#39;

我也尝试将服务函数 FilterListings()的返回类型更改为接口 IListingData ,但我仍然遇到了转换错误。

我在其他Stackoverflow帖子上搜索过。这回答了从Base类中返回派生类型的问题。但我认为这是一个不同的场景。

底线,我的服务类函数有一个返回类型 Animal(),并且从函数内部我想要返回 Dog()

我错过了什么?

2 个答案:

答案 0 :(得分:0)

在您的示例代码中,您无法返回DerivedData1的新List,其中函数返回类型是ListData的List。 原因是两种列表类型之间没有层次关系。 你能做的是:

 public List<ListingData> FilterListings(PredicateHandler predicates)
        {
            var list = new List<BaseData>();
            var list.Add(new DerivedData1());
            var list.Add(new DerivedData2());

            return list;
         }

答案 1 :(得分:-1)

如果我在你的位置,我会使用List<object>,并在迭代时(例如)将object转换为所需的内容。您的问题是List<Base>List<DerivedFromBase>被视为无关(即使不舒服,也是预期的行为)。