使用 System.ComponentModel

Posted

技术标签:

【中文标题】使用 System.ComponentModel【英文标题】:Working with System.ComponentModel 【发布时间】:2012-12-03 08:44:17 【问题描述】:

我在理解 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,它将返回 Entity,但作为 IContainer。也就是说,如果我想访问 Foo,我必须明确地做类似(Console.WriteLine(p.Site.Container as Entity).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);
    

【讨论】:

所以基本上,与其接受任何 IComponent,不如需要一个更专业的版本来满足我的需求?现在,您的示例检查类型与需要具有类型约束的泛型类型相比有很大区别吗?我会假设有,但此刻我已经失去了微妙之处。 在这种情况下应用泛型可能会很好,但不幸的是,.NET 2.0 中引入了泛型,但 ComponentModel 来自 .NET 1.0,因此泛型不可用。 @Eilon,为什么不直接使用is 运算符。它会比IsAssignableFrom干净得多。

以上是关于使用 System.ComponentModel的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)