Я показываю класс на 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 в пользовательском интерфейсе, чтобы они действительно менялись в экземпляре отраженного класса, хранящегося в корне дерева.
Итак, есть два способа сделать это:
- Сохранить родительскую (владеющий класс) каждый узел в узле дерева, и создавая «адрес путь» для каждого узла, а затем с помощью отражения найти измененный узел и фактически его изменить (в экземпляре отраженного класса)
- Вместо узлов дерева, содержащего значения параметров отраженного класса, они могут содержать какой-то указатель на параметры в экземпляре отраженного класса.
Возможно ли решение 2? Есть ли какой-нибудь эквивалент указателя в C#, который может позволить такую функциональность?
Можете ли вы придумать лучшее решение?
Примечания:
- Дерево может иметь классы, содержащие другие классы, а глубина не ограничивается. На данный момент я не использую structs где-нибудь
- Я не могу изменить отраженный класс. Он автоматически сгенерирован
- Безопасный код является предпочтительным, но если ничего не доступно небезопасный код будет делать
Вы можете прикрепить 'Action' ему, так что вы можете выполнить, что в инкубаторе для этого имущество? –
Да, но как действие будет знать, какой параметр изменить? – Nitay
Если вы можете, приложите к тегу действие 'val => instance.X = val' или что-то еще. –