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

C# 基于运行时参数类型的方法动态选择,c#,C#,我在过去看到过类似的问题/答案,但我的问题/答案与我看到的其他问题/答案略有不同 本质上,我有一个公共接口和几个实现/继承它的类。然后,在一个单独的类中,我有一些方法必须作用于接口IOObject给定的对象。但是,必须以不同的方式对它们中的每一个进行操作,因此,对于扩展IOObject的每个具体类型,都有一个单独的方法声明 class IObject { ... } class ObjectType1 : IObject { ... } class ObjectType2 :

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

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

class IObject
{
    ...
}

class ObjectType1 : IObject
{
    ...
}

class ObjectType2 : IObject
{
    ...
}

class FooBar
{
    void Foo (ObjectType1 obj);
    void Foo (ObjectType2 obj);
}
现在,对我来说,一个明显的解决方案是利用动态绑定,将方法Foo放在每个单独的类中,这样会在运行时自动选择要执行的正确Foo。但是,这在这里不是一个选项,因为我定义了多个模型来处理这些对象,我更愿意将每个单独的模型封装在自己的类中处理对象,而不是将所有的模型填充到对象类中

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


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

您只需创建一个采用接口类型的方法,然后检查正确的类型 投下它

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());
            } 
        }
这是因为类实现了IOObject ,cls.ID只是一个示例,您可以放置一个实现的属性。
请试一试,让我知道……祝你好运。

动态关键字实际上非常擅长这一点:

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

代码非常简单,而且非常简单。

哦,哇,如果它的行为与它看起来的一样,那就太棒了!当我有机会的时候,我会玩弄一下,但是谢谢你的解决方案。我的代码的重点是可读性和易于维护,所以这看起来非常令人惊讶。这是几天前a采取的方法(因为我熟悉它,需要一个演示)。现在,我正在更广泛地解决这个问题,我正在探索其他可能针对C#的更简单的选择。不过,这种方法确实有效!