在某些遗留代码中,出现以下代码片段数百次:
myObj.ReportGenerator.Preview = reportingObj.PreviewDocument;
...“ReportGenerator”和“ReportingObj”都是第三方库的实例,因此无法修改。
此代码在Windows XP下运行良好,但在Windows 7中运行该程序确实需要以下额外代码:
reportingObj.Render();
myObj.ReportGenerator.Preview = reportingObj.PreviewDocument;
不幸的是,这段代码中出现了数百个代码库,并且手动搜索它们听起来很容易出错。
由于“ReportGenerator”和“reportingObj”是第三方,我无法更改其getter / setter。
处理此类问题的优雅方法是什么?
答案 0 :(得分:4)
您可以将ReportingObj
包装在您委派给原始ReportingObj的自己的类中,但是对于PreviewDocument
属性检查以查看是否调用了Render()
,如果没有叫它 - 像这样:
public Foo PreviewDocument
{
get
{
if (!_rendered)
{
_originalreportingObj.Render();
_rendered = true;
}
return _originalreportingObj.PreviewDocument;
}
}
答案 1 :(得分:1)
您可以更改myObj
的类,我假设它在您的控制之下,并让ReportGenerator
属性返回一个包装类,该类可以调用Preview
的原始setter或调用Render()
后调用它:
public class ReportGeneratorWrapper
{
private ReportGenerator m_InnerReportGenerator;
public PreviewDocument Preview
{
get
{
return m_InnerReportGenerator;
}
set
{
if (IsNT6OrAbove)
value.Render();
m_InnerReportGenerator = value;
}
}
}
答案 2 :(得分:1)
您可能会发现创建静态类的返工量最少,如:
public class Previewer
{
public static PreviewDocumentType PreviewDocument(ReportingObject reportingObj) {
reportingObj.Render();
return reportingObj.PreviewDocument;
}
}
其中PreviewDocumentType是从PreviewDocument返回的类型,而ReportingObject是报告对象的类型。
然后您可以替换
reportingObj.PreviewDocument;
与
Previewer.PreviewDocument(reportingObj);