Ber*_*ron 3 c# inheritance dynamic
我有一组我没写过的课程,而且它们只读.让我们说,例如,这些类是以下类:
public class Base { }
public class B : Base { }
public class C : B { }
public class D : Base { }
Run Code Online (Sandbox Code Playgroud)
我想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");
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我正在尝试使用该关键字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());
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用适配器模式,但我真的有太多的类.
这样做是一个好主意dynamic吗?是否有可能使这项工作?
谢谢.
这是因为Foo永远不会被添加为方法.扩展方法仍然只是静态类中的静态方法,实际上并不直接与所讨论的类相关联.它们不像混合物(红宝石).编译器只是将对象上看起来像调用的内容转换为静态方法.
与呼叫相同: Extensions.Foo(thing)
我最好的建议是创建一个查找表(Dictionary),您可以注册不同版本的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");
}
}
Run Code Online (Sandbox Code Playgroud)