c# - 在这种情况下我可以避免反射(reflection)吗?

标签 c#

假设我有这些类层次结构:

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/

相关文章:

c# - EPPlus 不保存对工作表的更改

c# - 如何知道正在更改服务器上的共享文件夹的计算机的主机名/IP 地址

c# - 与 NHibernate 的开发人员安全双向关系

c# - 从 Excel 文件中提取数据并存储在 SQL Server 数据库中

c# - WCF Web 服务客户端没有端点监听

C# 如何获得操作系统架构(x86 或 x64)?

c# - 同步两个枚举

c# - 否则还是返回?

C#:从 Windows 服务捕获屏幕

c# - 删除服务