7

はじめに

私は2つのクラスを含むレガシーコードを扱っています:

  • System.Objectタイプの値を格納するクラスがあります。(私はこのクラスを と名付けましたDomainItem)
    • その Identifier プロパティは、DomainItem(ビジネス ドメインのコンテキストで) タイプが何であるかという情報を保持する列挙型を参照します。
  • これらの項目を 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はわかっているので、何とかそのようなコレクションを作ることができるはずです。

4

1 に答える 1

13

ジェネリック プロパティのようなものはありませんが、ジェネリックメソッドを簡単に作成できます。

public T GetValue<T>() { ... }

public void SetValue<T>(T value) { ... }

次に、メソッド内をチェックtypeof(T)して、識別子に適していることを確認できます。理想的には、識別子を読み取り専用にします。(コンストラクターの引数として使用する方が適切です。時間の経過とともに識別子が変更されたドメイン アイテムを使用しても意味がないと思います。)

または、.NET 4+ で C# 4+ を使用していると仮定して、の代わりにプロパティの型を作成することもできます。その後、サンプル コードはコンパイルされますが、実行時に暗黙的な (動的な) 変換が実行されます。そこではあまり安全ではありませんが、コンパイルできます...Valuedynamicobjectdouble

于 2013-01-18T12:54:35.213 に答える