C# 在以下遗留代码中避免大量代码更改的优雅方法

C# 在以下遗留代码中避免大量代码更改的优雅方法,c#,legacy-code,C#,Legacy Code,在某些旧代码中,以下代码段出现了数百次: myObj.ReportGenerator.Preview = reportingObj.PreviewDocument; 。。。鉴于“ReportGenerator”和“ReportingObj”都是第三方库的实例,因此不可修改 该代码在Windows XP下运行良好,但在Windows 7中运行该程序确实需要以下额外代码行: reportingObj.Render(); myObj.ReportGenerator.Preview = reporti

在某些旧代码中,以下代码段出现了数百次:

myObj.ReportGenerator.Preview = reportingObj.PreviewDocument;
。。。鉴于“ReportGenerator”和“ReportingObj”都是第三方库的实例,因此不可修改

该代码在Windows XP下运行良好,但在Windows 7中运行该程序确实需要以下额外代码行:

reportingObj.Render();
myObj.ReportGenerator.Preview = reportingObj.PreviewDocument;
不幸的是,这段代码在整个代码库中出现了数百次,手动搜索它们听起来像是一个非常容易出错的过程

由于“ReportGenerator”和“reportingObj”是第三方,我不能更改它们的getter/setter


处理此类问题的优雅方法是什么?

您可以将
ReportingObj
封装在自己的类中,在该类中您只需委托给原始ReportingObj,但对于
PreviewDocument
属性检查,查看是否调用了
Render()
,如果没有调用它,类似这样:

public Foo PreviewDocument
{
    get
    {
        if (!_rendered)
        {
            _originalreportingObj.Render();
            _rendered = true;
        }
        return _originalreportingObj.PreviewDocument;
    }
}

您可以更改
myObj
的类,我假设该类由您控制,并让
ReportGenerator
属性返回一个包装类,该包装类调用
预览的原始setter
或在调用
Render()
后调用它:


您可能会发现,最少的返工将是创建一个静态类,例如:

public class Previewer
{
     public static PreviewDocumentType PreviewDocument(ReportingObject reportingObj) {
       reportingObj.Render();
       return reportingObj.PreviewDocument;
     }
}
其中PreviewDocumentType是从PreviewDocument返回的类型,ReportingObject是报告对象的类型

然后,您可以替换

reportingObj.PreviewDocument;


好主意!您能澄清一下“委托给原件”的确切含义吗?你的意思是让Foo成为reportingObj类的子类吗?不使用组合而不是继承-原始reportingObj'是这个类中的一个字段-新类上的每个方法调用都只调用包装实例上的相同方法
reportingObj.PreviewDocument;
Previewer.PreviewDocument(reportingObj);