假设我有这些类层次结构:
public abstract class Parent {
}
public class A : Parent {
public void Update() { }
}
public class B : Parent {
public void Update() { }
}
public class C : Parent {
public void Update() { }
public void Update(bool force) { }
}
如您所见,Parent
的所有后代都有一个没有参数的 Update 方法。
我想创建一个实用程序类,它可以与任何类型的 Parent
对象一起使用,并在过程结束时调用 Update
。我确信 Update 方法会被执行,所以我写了这段代码:
public class ParentUtilities {
private static readonly Dictionary<Type, MethodInfo> g_UpdateMethods = new Dictionary<Type, MethodInfo>{
{ typeof(A), typeof(A).GetMethod("Update", new Type[] {})},
{ typeof(B), typeof(B).GetMethod("Update", new Type[] {})},
{ typeof(C), typeof(C).GetMethod("Update", new Type[] {})}
};
public static void DoSomething(Parent p)
{
CalculateTheMeaningOfTheLife(p);
g_UpdateMethods[p.GetType()].Invoke(p, null);
}
}
因为我无法控制类层次结构(它来自第 3 方程序集)。我只能更改实用程序类。我怎样才能避免这种调整?
因为我坚持使用 .Net 3.5 SP1,所以我不能使用动态。
最佳答案
在不接触这些类的情况下,您可以做的一件事是创建您自己的接口(interface)IUpdateable
,然后创建您自己的新并行层次结构,如
interface IUpdateable
{
void Update();
}
public class A : Original.A, IUpdateable {}
如果您随后可以使用自己的叶类而不是原始叶类,则可以将方法编写为接受 IUpdateable
参数。但是,虽然使用您自己的类不是很困难(使用
alias directives 可以提供帮助),但生成它们并不是那么容易(您需要在每次调用后插入自定义代码创建原始类的任何实例的原始库,如果该实例的类型为 Parent
,则回到原点)。
看到原代码的作者也不要忘记迫害。
关于c# - 在这种情况下我可以避免反射(reflection)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11205266/