使用System.ComponentModel

Kyl*_*ran 6 c# components system.componentmodel

我在理解容器/组件模型如何在C#中相互交互时遇到了一些困难.我得到了Component如何包含一个Site对象,它包含有关Container和Component的信息.但是,假设我有以下代码:

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");            

    }    

}
Run Code Online (Sandbox Code Playgroud)

这没有问题,它定义了容器(实体)和包含在其中的组件(位置).

但是,如果我调用p.Site.Container它,它将返回Entity,但作为IContainer.也就是说,(Console.WriteLine(p.Site.Container as Entity).Foo);如果我想访问Foo ,我必须明确地做一些事情.这看起来非常麻烦.

我错过了什么,或者有更好的方法来做我想做的事情吗?

Eil*_*lon 2

你没有遗漏任何东西。没有关于组件可以位于哪个容器中的接口契约。如果您想限制可以添加到容器中的组件类型,您可以重载 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);
    }
}
Run Code Online (Sandbox Code Playgroud)