我不确定这是否可行,但如果不可行,那么最好/最优雅的方法是什么。
我有一个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。
答案 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());
}