はじめに
私は2つのクラスを含むレガシーコードを扱っています:
System.Object
タイプの値を格納するクラスがあります。(私はこのクラスを と名付けましたDomainItem
)- その Identifier プロパティは、
DomainItem
(ビジネス ドメインのコンテキストで) タイプが何であるかという情報を保持する列挙型を参照します。
- その Identifier プロパティは、
- これらの項目を Enumerable List として格納するクラスもあります。(
DomainItems
)
そのうえ:
- これらのクラスをジェネリックに変更したくありません。このコードは非常に機密性が高く、テストの対象外です。
- を取得するには、コレクション
DomainItem
から取得する必要があります。DomainItems.Items
コード
クラスのコードは次のようになります。
public class DomainItem
{
public Identifier Identifier { get; set; } // Readonly in the "real" code
public object Value { get; set; }
}
public class DomainItems
{
public IEnumerable<DomainItem> Items { get; set; }
}
質問は
ジェネリックを使用してこれらのクラスを拡張し、コンパイル時に Value プロパティの型を解決するにはどうすればよいですか。それは可能ですか?
例としては、次のようなものがあります。
DomainItem price = new DomainItem { Value = 25.20d, Identifier = Identifier.Price };
// ....
double priceValue = price.ProperValue; // generic property of type T
明らかに、上記のコードは概念的なものであり、私が達成したいことを示しています。それを解決する方法はありますか?それは可能ですか?
編集
私の考えはIEnumerable<DomainItem<T>>
、コレクションが非ジェネリックDomainItem
オブジェクトから取り込まれる新しいものを作成することです。の型DomainItem.Value
はわかっているので、何とかそのようなコレクションを作ることができるはずです。