基于运行时参数类型的方法动态选择

7

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

基本上,我有一个公共接口和几个实现/继承该接口的类。然后,在一个单独的类中,我有必须根据给定的IObject接口对象执行方法的方法。然而,每个对象必须以不同的方式被处理,因此对于每个扩展IObject的具体类型都有一个单独的方法声明。

class IObject
{
    ...
}

class ObjectType1 : IObject
{
    ...
}

class ObjectType2 : IObject
{
    ...
}

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

现在,对我来说,一个显而易见的解决方案是通过利用动态绑定,在每个单独的类中放置方法Foo,这将自动选择在运行时执行的正确Foo。然而,这在这里不是一个选项,因为我正在定义多个如何处理这些对象的模型,并且我宁愿将处理对象的每个单独模型封装在其自己的类中,而不是将所有模型都放入对象类中。
我找到了这篇文章,其中介绍了如何使用字典在运行时动态选择正确的方法实现。我对这种方法很满意;但是,假设我必须在每个模型中执行此类分发。如果我只有IObject及其具体实现,是否有任何方式可以概括这种方法,以便我可以基于对象的运行时类型调用任何名称的方法?
我知道这可能是一个不清楚的问题,但我会非常感激任何帮助。
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");
    }
}

代码非常简单,同时其性能相当不错


1
哇!如果这个表现如它看起来的那样,那么这真是太好了!我会在有机会的时候试一下,但是感谢你给出的解决方案。我的代码注重可读性和易维护性,所以这看起来非常棒。 - TSM

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只是一个示例,您可以放置您实现的任何属性。请尝试并让我知道...最好的祝愿。


这是我几天前采取的方法(因为我熟悉它并需要一个可用的演示)。现在我正在更广泛地解决这个问题,探索其他更简单的选项,可能特定于 C#。不过这种方法确实可行! - TSM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接