7

我在过去看到过类似的问题/答案,但我的与我看到的其他问题略有不同。

本质上,我有一个通用接口和几个实现/继承它的类。然后,在一个单独的类中,我有必须作用于接口 IObject 给出的对象的方法。但是,它们中的每一个都必须以不同的方式进行操作,因此为什么对于扩展 IObject 的每个具体类型都有一个单独的方法声明。

class IObject
{
    ...
}

class ObjectType1 : IObject
{
    ...
}

class ObjectType2 : IObject
{
    ...
}

class FooBar
{
    void Foo (ObjectType1 obj);
    void Foo (ObjectType2 obj);
}

现在,对我来说,一个明显的解决方案是通过将方法 Foo 放在每个单独的类中来利用动态绑定,这将在运行时自动选择正确的 Foo 来执行。然而,这不是一个选项,因为我定义了多个模型来处理这些对象,我宁愿将每个单独的模型封装在其自己的类中处理对象,而不是将所有模型填充到对象类中.

我发现这篇文章展示了如何使用字典在运行时动态选择正确的方法实现。我对这种方法很好;但是,假设我必须在每个模型中执行一次这样的调度。如果我只有 IObject 及其具体实现,有没有办法概括这种方法,以便我可以根据对象的运行时类型调用任何名称的方法?

我知道这可能是一个不清楚的问题,但我将非常感谢任何帮助。

4

2 回答 2

10

dynamic关键字实际上非常擅长:

void Main()
{
    var foobar = new FooBar();
    foreach(IObject obj in new IObject[]{ new ObjectType1(), new ObjectType2()})
    {
        foobar.Foo((dynamic)obj);
    }   
    // Output:
    //  Type 1
    //  Type 2
}

class IObject
{
}

class ObjectType1 : IObject
{
}

class ObjectType2 : IObject
{
}

class FooBar
{
    public void Foo (ObjectType1 obj) {
        Console.WriteLine("Type 1");
    }
    public void Foo (ObjectType2 obj) {
        Console.WriteLine("Type 2");
    }
}

代码超级简单,性能也不错

于 2013-06-10T23:15:58.427 回答
0

您可以只制作一种采用接口类型的方法,然后检查正确的类型并进行转换

ObjectType1 obj1 = new ObjectType1();

foo(obj1);

void foo(IObject fm)
        {
            ObjectType1 cls;
            if (fm is ObjectType1)
            {
                cls = fm as ObjectType1;
                cls.ID = 10;
                MessageBox.Show(cls.ID.ToString() + "    " + cls.GetType().ToString());
            } 
        }

那是因为类实现了 IObject ,cls.ID 只是一个示例,您可以放置​​一个您实现的属性。请尝试一下,让我知道....最良好的祝愿。

于 2013-06-10T23:08:55.667 回答