データモデルであるサードパーティのクラスがあるとしましょう。おそらく 100 個のプロパティがあります (パブリック セッターとゲッターを持つものもあれば、パブリック ゲッターとプライベート セッターを持つものもあります)。このクラスを ContosoEmployeeModel と呼びましょう
このクラスをインターフェイス (Name プロパティと DBID プロパティを持つ INavigationItem) でファサード化して、アプリケーションで使用できるようにしたいと考えています (これは 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 を返すように拡張することはできません。そのため、モデルをラップすることが考えられる唯一の解決策です - ただし、修正されてうれしいです: )