C#动态替换对象类中的对象〜

时间:2013-09-21 22:02:06

标签: c# object types casting type-conversion

我想这是我对同一主题的第二篇文章,有点......

无论如何,我想通过传递AI行为来动态更新我的代理 AIbundles 类来替换或添加:

* 不工作代码

public class agent
{
    AIbundles = new AIbundle();

    public void UpdateBehavior (object Behavior)
    {
        object CastedBehavior = (Behavior.type) Behavior; //Cast
        this.agent.AIbundles.(Behavior.type) = CastedBehavior; 
    }
}

我的AIbundles类示例(极简化)

public class AIbundles 
{
    ExampleBehavior1 ExampleBehavior1;
    ExampleBehavior2 ExampleBehavior2;
    ExampleBehavior3 ExampleBehavior3;

    AIbundles()
    {
        ExampleBehavior1 = new ExampleBehavior1();
        ExampleBehavior2 = new ExampleBehavior2();
        ExampleBehavior3 = new ExampleBehavior3();
    }
}

可悲的是,我很清楚这是实现这一点的一种非常糟糕的方式,是否有更好的动态处理对象的方法?

2 个答案:

答案 0 :(得分:3)

在我看来,你的ExampleBehavior类应该扩展一些基类型(无论是抽象类还是接口都取决于你的情况)。我们调用基类型BehaviorBase。然后,您的AIBundle类应该有一个名为BehaviorBase的{​​{1}}类型的属性,您可以执行类似的操作,而不需要任何类型的转换:

Behavior

你会这样称呼:

public void UpdateBehavior(BehaviorBase behavior) {
   this.agent.AIbundles.Behavior = behavior;
}

此时,我强烈考虑删除var agent = ...; var someAIThing = initWithAgent(agent); BehaviorBase behavior = ...; someAIThing.UpdateBehavior(behavior); 方法,并直接将行为直接分配给属性:

UpdateBehavior

答案 1 :(得分:0)

也许你不应该在类“集合”中创建每种类型的属性。 如果要按名称检索正确的行为,请使用Dictionary。 或者只是一个行为列表。 如果需要,每个行为都可以具有类似名称或类型属性的标识。 您也可以拥有一个IBehavior接口,该接口具有常见的方法......

这样的事情可能会为你做到这一点我想:

    public class AIbundles
    {
        public Dictionary<string, IExampleBehavior> ExampleBehaviors { get; set; }

        public AIbundles()
        {
            this.ExampleBehaviors = new Dictionary<string, IExampleBehavior>();
        }

    } 

    public class agent {
        AIbundles bundles = new AIbundles();

        public void UpdateBehavior (IExampleBehavior behavior)
        {
            this.bundles.ExampleBehaviors[behavior.Name] = behavior;
        }
     }