2015-12-15 2 views
4

Я показываю класс на TreeListView (на ObjectListView) с использованием отражения. TreeListView работает с делегатом ChildrenGetter(), который получает отображаемые узлы (см. here).Непрямо изменяющиеся параметры класса

Для отображения класса (мы будем называть его отражение класса), корень дерева является экземпляром класса, а ChildrenGetter(object x) использует отражение, чтобы вернуть экземпляры каждого ребенка отраженный класс.

Например, для этого класса:

public class Folder 
{ 
    public int BuildNumber { get; set; } 
    public int MaxSpeed { get; set; } 
} 

Корень будет экземпляром папки, и она будет иметь 2 дочерние узлы, содержащие значение BuildNumber и MaxSpeed.

Это работает нормально, но только для отображения. Я хотел бы иметь возможность изменять значения BuildNumber и MaxSpeed ​​в пользовательском интерфейсе, чтобы они действительно менялись в экземпляре отраженного класса, хранящегося в корне дерева.

Итак, есть два способа сделать это:

  1. Сохранить родительскую (владеющий класс) каждый узел в узле дерева, и создавая «адрес путь» для каждого узла, а затем с помощью отражения найти измененный узел и фактически его изменить (в экземпляре отраженного класса)
  2. Вместо узлов дерева, содержащего значения параметров отраженного класса, они могут содержать какой-то указатель на параметры в экземпляре отраженного класса.

Возможно ли решение 2? Есть ли какой-нибудь эквивалент указателя в C#, который может позволить такую ​​функциональность?

Можете ли вы придумать лучшее решение?

Примечания:

  • Дерево может иметь классы, содержащие другие классы, а глубина не ограничивается. На данный момент я не использую structs где-нибудь
  • Я не могу изменить отраженный класс. Он автоматически сгенерирован
  • Безопасный код является предпочтительным, но если ничего не доступно небезопасный код будет делать
+0

Вы можете прикрепить 'Action ' ему, так что вы можете выполнить, что в инкубаторе для этого имущество? –

+0

Да, но как действие будет знать, какой параметр изменить? – Nitay

+1

Если вы можете, приложите к тегу действие 'val => instance.X = val' или что-то еще. –

ответ

1

Если вы можете прикрепить некоторые метаданные для управления/элементов дерева, которые Вы создаете, вы можете создать Action<T> и назначьте его тегу или что-то в этом роде.

Если у вас есть свой экземпляр, вы могли так что-то вроде этого (используется string как тип выборки данных):

Action<string> action = val => instance.X = val; 
Смежные вопросы