2013-11-02 2 views
0

У меня есть родительский класс под названием Widget. У меня есть список виджетов, которые я храню. В этом списке хранятся дочерние элементы виджета, такие как Button, Label, DropDown и т. Д. Когда в моем редакторе выбран ребенок, я назначаю этот объект (его по имени в списке виджетов) в PropertyGrid. Однако, поскольку они хранятся как вид Widget, свойство PropertyGrd показывает только свойства виджета. Я хочу нарисовать дочерний виджет на его фактический тип, когда я установил его в PropertyGrid, чтобы PropertyGrid мог видеть свойства дочернего элемента, но я хочу сделать это динамически, вместо использования команд if/case, потому что дочерние виджеты используют систему Plugin, поэтому Я не буду знать, что такое тип во время разработки. Я знаю, что я должен использовать отражение, и я в порядке, но я просто не знаю, как это сделать.C# Динамически литой объект для сетки свойств

Поскольку я храню дочерние виджеты в контейнере родительского виджета, он будет храниться как виджет, не так ли? Значение PropertyGrid видит только свойства виджета?

Dictionary<string, Widget> Widgets; 

Widgets.Add("button1", new Button()); // gets converted to parent Widget 

PropGrid.SelectedObject = Widgets["button1"]; 


public class Button : Widget.Widget 
{ 
    public String Test { get; set; } // this doesn't show up in the property grid 
} 
+0

Просьба указать код. – ataravati

+0

Можете ли вы показать свойство примера, которое не отображается? Если ваш код похож на тот, который показан в ответе Тима, он должен уже работать, поэтому пример поможет. Также: это winforms? Wpf? Или...? –

+0

@MarcGravell 'PropertyGrid' - класс winforms. Я добавил этот тег. –

ответ

3

Я предполагаю, что у вас есть код вроде этого:

myPropertyGrid.SelectedObject = widget; 

Поскольку SelectedObject свойства типа object, это не имеет значения, является ли вы присвоить ему объект, статический известный как a object, Widget, или Button: он будет принят в качестве object. Свойства вашего ребенка не появляются по какой-либо другой причине.

+0

Но я храню свои объекты, такие как Dictionary Widgets; Поэтому, когда я добавляю кнопку, например, она хранится как виджет, потому что я делаю: Widgets.Add («button1», new Button()); Таким образом, его бросают в Виджет, когда он хранится в контейнере, а это означает, что когда я вытаскиваю его обратно, он все еще типа Widget, не так ли? Так или иначе, это работает на C++, поэтому я предполагаю, что это одинаково для C#. – user441521

+0

@ user441521 Когда вы вытаскиваете его без кастинга, его статически известный тип (тип, о котором компилятор знает, что вы можете видеть в таких случаях, как при наведении на виджет) - это «Виджет», но его тип времени выполнения (который вы можете видеть с помощью 'widget.GetType()', между прочим) на самом деле будет 'Button'. Из вашего описания это похоже на то, что C++ отличается в этом отношении: во время выполнения нет контейнера для литья, который говорит «это кнопка, но я использую ее как виджет». –

+0

Просто, чтобы быть на 100% понятным: в .net, вы назначаете его как type 'object'; он будет использовать GetType и TypeDescriptor и т. д., чтобы понять объект во время выполнения. –

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