2010-04-02 2 views
0
public interface ITest { 
    void Somethink(); 
} 

public class Test1 : ITest { 
    public void Somethink() { /* do stuff */ } 
    public int Test1Property { get; set; } 
} 

public class Test2 : ITest { 
    public void Somethink() { /* do stuff */ } 
    public float Test2Property { get; set; } 
} 

//Main class 
public class MainClass 
{ 
    [TypeConverter(ExpandableObjectConverter)] 
    public ITest test { get; set; } 
} 

Хорошо, у меня это так. Экземпляр MainClass выбран PropertyGrid.PropertyGrid + интерфейс

Как сделать DropDownList объектов классов, реализующих ITEST (здесь Test1 и test2)

ответ

1

Это не то, как это работает. Свойство test test getter возвращает объект конкретного класса, который реализует ITest. Все, что ему было назначено последним, либо null, либо объект Test1, либо объект Test2. PropertyGrid использует Reflection для просмотра объекта Type и его членов. Он отобразит либо Test1Property, либо Test2Property. Вы не можете выбрать.

Не уверен, что вы пытаетесь сделать, вы, вероятно, хотите UITypeEditor, если хотите назначить объект другого типа.

+0

Я проверил, как работает UITypeEditor – nilphilus

0

Хорошо, я использовал UITypeEditor (thx nobugz) и создал combobox для возможных значений. Значения, которые я получаю от Type[] BehaviorManager.GetBehaviorsWhichImplement(Type type), - которые возвращают массив типов, реализующих данный интерфейс.

Когда пользователь выбрал новое значение, я получаю новый экземпляр выбранного объекта BehaviorManager.GetBehavior(Type), который использует Activator.CreateInstance. И присвойте ему свойство.

Конечно, это не DropDownList, но это очень хорошо тоже :-)

здесь является статьей, в которой я следующее - http://philwinkel.com/blog/?p=4

Я знаю, моя грамматика трагична, извините, я я все еще пытаюсь сделать это с этим ;-)