gpt4 book ai didi

C# : dynamic polymorphism with non polymorphic classes

转载 作者:行者123 更新时间:2023-11-30 14:42:31 26 4
gpt4 key购买 nike

我有一组我没有编写的类,它们是只读的。例如,假设这些类是以下类:

public class Base { }
public class B : Base { }
public class C : B { }
public class D : Base { }

我想在所有这些类上添加方法 Foo(),我正在使用扩展方法:

public static class Extensions {

public static void Foo(this Base obj) {
dynamic dynobj = obj;
try {
dynobj.Foo();
}
catch (RuntimeBinderException ex) {
Console.WriteLine(ex.Message);
}
}

public static void Foo(this B b) {
Console.WriteLine("Foo in B");
}

public static void Foo(this C c) {
Console.WriteLine("Foo in C");
}

}

如您所见,我正在尝试使用关键字 dynamic,期望它知道我的对象的真实类型并调用它的 Foo() 方法。但是... dynobj.Foo() 总是失败。

static void Main(string[] args) {
List<Base> list = new List<Base>();
list.Add(new B());
list.Add(new C());
list.Add(new D());

list.ForEach(x => x.Foo());
}

我知道我可以使用适配器模式,但我的类实在太多了。

dynamic 做这个是个好主意吗?有可能使这项工作吗?

谢谢。

最佳答案

这是因为 Foo 永远不会作为方法添加。扩展方法仍然只是静态类中的静态方法,实际上并不直接与相关类相关联。它们不像混合( ruby )。编译器只是将看起来像是对您的对象的调用转换为静态方法。

与调用相同:Extensions.Foo(thing)

我最好的建议是创建一个查找表(字典),您可以在其中注册不同版本的 Foo。

也许是这样的(未经测试)?

public static class Extensions {

private static Dictionary<Type, Action<Base>> callFoo = new Dictionary<Type, Action<Base>>
{
{typeof(B), b => (b as B).Foo()},
{typeof(C), b => (b as C).Foo()}
};

public static void Foo(this Base obj) {
try {
callFoo[typeof(obj)](obj);
}
catch (RuntimeBinderException ex) {
Console.WriteLine(ex.Message);
}
}

public static void Foo(this B b) {
Console.WriteLine("Foo in B");
}

public static void Foo(this C c) {
Console.WriteLine("Foo in C");
}

}

关于C# : dynamic polymorphism with non polymorphic classes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3203240/

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