假设我有一个来自第 3 方的课程,它是一个数据模型。它可能有 100 个属性(一些具有公共设置器和获取器,其他具有公共获取器但私有设置器)。我们将这个类称为 ContosoEmployeeModel
我想用一个接口(INavigationItem,它具有 Name 和 DBID 属性)来装饰这个类,以允许它在我的应用程序中使用(它是一个 PowerShell 提供程序,但现在这并不重要)。但是,它还需要可用作 ContosoEmployeeModel。
我最初的实现是这样的:
public class ContosoEmployeeModel
{
// Note this class is not under my control. I'm supplied
// an instance of it that I have to work with.
public DateTime EmployeeDateOfBirth { get; set; }
// and 99 other properties.
}
public class FacadedEmployeeModel : ContosoEmployeeModel, INavigationItem
{
private ContosoEmployeeModel model;
public FacadedEmployeeModel(ContosoEmployeeModel model)
{
this.model = model;
}
// INavigationItem properties
string INavigationItem.Name { get; set;}
int INavigationItem.DBID { get; set;}
// ContosoEmployeeModel properties
public DateTime EmployeeDateOfBirth
{
get { return this.model.EmployeeDateOfBirth; }
set { this.model.EmployeeDateOfBirth = value; }
}
// And now write 99 more properties that look like this :-(
}
但是,很明显,这将涉及编写大量样板代码来公开所有属性,如果可以的话,我宁愿避免这种情况。我可以在部分类中 T4 代码生成此代码,如果没有更好的想法,我会这样做,但我想在这里问是否有人使用一些超级奇特 的 C# 魔法有更好的想法
请注意 - 我用来获取 ContosoEmployeeModel 的 API 只能返回 ContosoEmployeeModel - 我无法将其扩展为返回 FacededEmployeeModel,因此包装模型是我能想到的唯一解决方案 - 我很高兴得到纠正: )