2015-05-28 2 views
1

Я не уверен, что это возможно, но если это не так, то какой лучший/самый элегантный способ сделать это.Как передать производный класс функции базового класса и вернуть производный класс C#

У меня есть 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(), и он не позволит мне бросить Т как BaseClass. Я не уверен, как лучше справиться с этим. Я мог бы наложить DerivedClass на BaseClass и отправить его функции, но я хочу, чтобы он возвращал DerivedClass, а не BaseClass.

ответ

2

Вы ищете общие ограничения:

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

Сделать свойство/поле/метод, который вы используете, чтобы определить, является ли «OneYouWant» общественность, так что вы можете увидеть его в производном классе.

например:

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

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

Edit: Предназначенный общественного

Если вы не хотите, чтобы выставить свойство/поле/метод, то сделать это свойство защищены и сделать метод, который может добраться до него внутренне, но выполните необходимую проверку.

например:

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()); 
} 
Смежные вопросы