如何将派生类传递给基类函数并返回派生类c#

时间:2015-05-28 19:32:37

标签: c# class

我不确定这是否可行,但如果不可行,那么最好/最优雅的方法是什么。

我有一个List<DerivedClass>,我想从列表中提取一个符合某个标准的元素来自它的BaseClass。

public class BaseClass {...}
public class DerivedClass : BaseClass {...}

List<DerivedClass> dcList = new List<DerivedClass>();
..
DerivedClass dc = GetTheOneWeWant(dcList)

这个函数看起来像这个

public BaseClass GetTheOneWeWant(List<BaseClass> bc) {
  return bc[0]; //for example
}

这样该函数可以应用于所有派生类。

我试过这样的事情

    public T GetClosest<T>(List<T> list) {
        return list.Aggregate((c, d) => c.DistanceFrom(FrameCenterX, FrameCenterY) < d.DistanceFrom(FrameCenterX, FrameCenterY) ? c : d);
    }

但是T不知道方法DistanceFrom(),它不会让我把T作为BaseClass。我不确定处理此问题的最佳方法。我可以将DerivedClass转换为BaseClass并将其发送到函数,但我希望它返回DerivedClass,而不是BaseClass。

2 个答案:

答案 0 :(得分:2)

您正在寻找通用约束:

public T GetClosest<T>(List<T> list) where T : BaseClass {

答案 1 :(得分:0)

制作您正在使用的属性/字段/方法,以确定&#34; OneYouWant&#34; public,以便您可以在派生类中看到它。

例如:

class Base {
    public bool MyProperty {get;set;}
}
class Derived : Base {

}
main.cs {
    var derivedList = //a List<Derived>()
    var whatIWanted = derivedList.Where(d => d.MyProperty);
}

编辑:公开

如果您不想公开属性/字段/方法,那么请对该属性进行保护,并创建一个可以在内部访问它但可以执行所需验证的方法。

例如:

class Base {
    protected bool MyProperty {get;set;}
}
class Derived : Base {
    public bool IsWhatIWant() {
         return MyProperty;
    }
}
main.cs {
    var derivedList = //a List<Derived>()
    var whatIWanted = derivedList.Where(d => d.IsWhatIWant());
}