gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:05:15 25 4
gpt4 key购买 nike

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

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

class IObject
{
...
}

class ObjectType1 : IObject
{
...
}

class ObjectType2 : IObject
{
...
}

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

现在,对我来说,一个明显的解决方案是通过将方法 Foo 放置在每个单独的类中来利用动态绑定(bind),这将在运行时自动选择正确的 Foo 来执行。然而,这里不是一个选项,因为我定义了多个模型来处理这些对象,我宁愿将每个单独的模型封装在它自己的类中,而不是全部塞满将模型转化为对象类。

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

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

最佳答案

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

代码 super 简单,它有pretty decent performance .

关于c# - 基于运行时参数类型动态选择方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17034081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com