2017-02-09 5 views
2

У меня есть абстрактный классC# производные типы в поле со списком

public abstract class PairingMethod : IPairingMethod 
{ 
    virtual string Name { get; } = "Default Pairing"; 

    protected ICollection<IPlayer> PlayersToPair { get; set; } 


    protected PairingMethod(ICollection<IPlayer> players) 
    { 
     PlayersToPair = players; 
    } 

    public virtual void GeneratePairingsForRound(IRound round) 
    { 
     throw new System.NotImplementedException(); 
    } 

} 

Теперь я попытался создать поле со списком на основе всех типов, которые являются производными от базового класса выше. Я создал поле со списком, и он использует имена классов как элементы, но затем, когда запускается событие смены поля, мне нужно знать, какой производный класс был выбран. Тогда я могу создать экземпляр этого класса для генерации пар.

Я попытался реализовать свою собственную поле со списком с PairingMethods как элементы, но не могу заставить его работать.

Любые идеи/предложения?

C

+2

1. Правильно отформатируйте свой код, отступы здесь повсюду. 2. Покажите свой код со списком, это важный бит здесь. – DavidG

+0

'' он использует имена классов в качестве элементов [...] Мне нужно знать, какой производный класс был выбран «' - Не было бы это только текущим выбранным значением поля со списком? Не совсем ясно, в чем проблема. – David

+0

Извините, Дэвид, я могу получить индекс из выбранного элемента. Но что было бы чистым способом преобразования выбранного индекса в производный класс? – Jack

ответ

1

Благодаря совету Монг жуза я сделал следующий

public class PairingComboBox : ComboBox 
{ 
    private List<Type> _availableMethod = DerivedTypes.FindAllDerivedTypes<PairingMethod>(); 

    public PairingComboBox() 
    { 
     DataSource = DerivedTypes.FindAllDerivedTypes<PairingMethod>(); 
     DisplayMember = "Name"; 
    } 
} 

public static IPairingMethod CreateInstanceBinder 
       (string pairingMethodName, ICollection<IPlayer> players) 
{ 
     var t = Type.GetType(pairingMethodName + ",Pairings"); 
     return (PairingMethod)Activator.CreateInstance(t, players); 
} 

я называю CreatenIstanceBuilder при изменении поля со списком. Прохождение в лиге игроков.

Смежные вопросы