Работа с системой.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);
    }
}