Распространение свойств на родительский элемент управления C # - PullRequest
0 голосов
/ 24 марта 2012

Есть ли способ распространения свойств из дочернего элемента управления в родительский - чтобы я мог получить доступ к свойству, например - Parent.Property1 вместо Parent.Child.Property1? Я не могу использовать наследование - мой родитель не может быть расширенным дочерним типом - он унаследован от другого класса.

Также я не хочу добавлять код для каждого свойства от дочернего к родительскому, например:

public object Property1
{
   get{ return Child.Property1; }
   set{ ChildProperty1 = value; }
}

Может быть, с помощью отражения - что-то вроде этого?

public PropertyInfo[] Properties
{
  get{ return Child.GetType().GetProperties(); }
  set{ Child.GetType().GetProperties().SetValue() = value.GetValue()}
}

Спасибо

Ответы [ 2 ]

2 голосов
/ 24 марта 2012

Без смены родителя нет, но вам не нужно наследовать ребенка, вы можете просто пройти через свойство:

В родительском:

public object Property1
{
    get { return Child.Property1; }
    set { Child.Property1 = value; }
}

Тогда вы можете получить доступ к Parent.Child.Property1 также по Parent.Property1.

РЕДАКТИРОВАТЬ: Поскольку вы только что отредактировали свой вопрос, чтобы НЕ хотеть сделать это таким образом, вернитесь к «Нет, это невозможно.»!

0 голосов
/ 24 марта 2012

Что ж, это очень старая проблема проектирования, с которой вы сталкиваетесь - в C # нет четкого решения этой проблемы.
Как правило, это решается путем обобщения дочерних свойств (как уже отмечалось всеми), что можетбыть утомительным - или б) разоблачить ребенка, что не всегда лучший способ.
Я бы не советовал размышлять, потому что вы не хотите этого делать на самом деле.Производительность в стороне (может не заметить, что в небольших приложениях, но если вы примете такой стиль кодирования, он скоро будет преследовать вас), это просто приводит к плохому дизайну, грязному коду и трудностям, например, вы не знаетегде и кто мог бы использовать отражение, чтобы изменить какую-то другую часть или получить доступ - вы не хотите делать это со своим «собственным кодом» (в данном случае), только обычно, если его принуждают, используя другой код - или в некоторыхситуации (не редкие, каждый больший фрагмент кода имеет своего рода отражение, но по уважительной причине), который гарантирует, что у вас нет другого способа сделать что-либо, например пересечь общий неуниверсальный мир, получить динамические свойства и т. д.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...