gpt4 book ai didi

c# - 在继承类型中使用 C# 动态方法调用

转载 作者:行者123 更新时间:2023-11-30 16:41:38 24 4
gpt4 key购买 nike

我在尝试扩展基类时注意到一个意外行为。这是此问题的示例:

public class Program
{
static void Main(string[] args)
{
var test = new CoolProgram();
test.Start();
}

private void Start()
{
var arr = new object[]
{
1, // int
1L, // long
"Hello World" // string
};

foreach (var dyn in arr.Cast<dynamic>())
{
DoSomething(dyn);
}

Console.ReadKey();
}

protected virtual void DoSomething(int i)
{
Console.WriteLine("Int:" + i);
}

protected virtual void DoSomething(string str)
{
Console.WriteLine("Str:" + str);
}
}

Program 定义了两个方法 DoSomething,它们由 intstring 参数重载。 Start 方法创建一个包含装箱值的对象数组。定义之后,元素将使用 casteddynamic 进行迭代。到目前为止这工作正常(没有 long 值)。

如果我创建一个额外的继承类 CoolProgram 并为 long 类型添加另一个方法,程序将抛出一个 RuntimeBinderException 并告诉我最好的重载是 DoSomething(int)CoolProgram 的方法没有被执行。

public class CoolProgram : Program
{
protected override void DoSomething(int i)
{
// This works
Console.WriteLine("Cool Int: " + i);
}

protected override void DoSomething(string str)
{
// This works
Console.WriteLine("Cool Str: " + str);
}

protected virtual void DoSomething(long i)
{
// This is a new method for long
Console.WriteLine("Long:" + i);
}
}

任何人都可以解释这种行为或有解决方案吗?

最佳答案

您的示例可以进一步简化:

static void Main(string[] args)
{
Program test = new CoolProgram();
dynamic i = 1L;

test.DoSomething(i);
//test.Start();
}

问题是,就Start() 方法而言,this 的类型是Program。为 DoSomething() 添加一个 virtual 重载在 Start() 方法的上下文中没有任何意义。

在我上面的简化示例中也是如此。 test 的编译时类型是Program,就像Start()this 的类型是程序。因此,DoSomething(long) 重载在该上下文中不可见,也无法调用。

如果你想让它可见,你需要将它添加到基类,或者确保用于调用 DoSomething() 的引用静态类型为 CoolProgram。请注意,由于该方法在 CoolProgram 中被声明为 protected,如果您想改变引用 CoolProgram

最后,如果你真的想要完全动态的类型解析,你可以:

private void Start()
{
dynamic this2 = this;

var arr = new object[]
{
1, // int
1L, // long
"Hello World" // string
};

foreach (var dyn in arr.Cast<dynamic>())
{
this2.DoSomething(dyn);
}

Console.ReadKey();
}

如上所述,上述内容当然需要将 DoSomething(long) 设为public

关于c# - 在继承类型中使用 C# 动态方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48337639/

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