Работа с системой.ComponentModel
мне немного сложно понять, как модель контейнера/компонента взаимодействует друг с другом в C#. Я получаю, как компонент содержит объект сайта, который имеет информацию о контейнере и компоненте. Но, предположим, у меня есть следующий код:
using System;
using System.ComponentModel;
public class Entity : Container {
public string Foo = "Bar";
}
public class Position : Component {
public int X, Y, Z;
public Position(int X, int Y, int Z){
this.X = X;
this.Y = Y;
this.Z = Z;
}
}
public class Program {
public static void Main(string[] args) {
Entity e = new Entity();
Position p = new Position(10, 20, 30);
e.Add(p, "Position");
}
}
это работает без проблем, он определяет контейнер (сущность) и компонент (положение), который содержится внутри него.
однако, если я призываю p.Site.Container
, он вернет объект, но как IContainer. То есть, я должен был бы явно сделать что-то вроде (Console.WriteLine(p.Site.Container as Entity).Foo);
если бы я хотел получить доступ к Foo. Это кажется довольно громоздким.
Я что-то упускаю, или есть лучший способ сделать то, что я хочу?
1 ответов
вы ничего не пропустили. Нет контракта интерфейса относительно того, в каком контейнере может находиться компонент. Если вы хотите ограничить, какие компоненты могут быть добавлены в контейнер, вы можете перегрузить метод Add и выполнить проверку типа добавляемого компонента:
public class Entity : Container {
public string Foo = "Bar";
public virtual void Add(IComponent component) {
if (!typeof(Position).IsAssignableFrom(component.GetType())) {
throw new ArgumentException(...);
}
base.Add(component);
}
}