2009-09-01 38 views
1

ジェネリックタイプのパラメータに関する質問があります。一般的なパラメータタイプ

のは、私は私のドメインモデルに以下の定義があるとしましょう:

abstract class Entity<TId> 
{ 
    public TId Id { get; private set; } 
    /* ... */ 
} 

class Person : Entity<long> 
{ 
    public string Name { get; set; } 
    /* ... */ 
} 

は、今度は私が人の詳細を表示する方法を作成したいとしましょう:

public void Details(long? id) 
{ 
    if (!id.HasValue) { 
     Error(...); 
     return; 
    } 
    var person = PersonRepository.Get(id.Value); 
    ShowPersonDetail(person); 
} 

だが、さらに行こうとPersonRepositoryは、リポジトリの特殊化であるため、その正しい取得型ID引数(i)を受け入れるために、「Get」メソッドが「自動的に」実装されるようにします。この場合、long引数)。


今度は私が人のIdsはGUIDがなければならないことを決定し、一日にしましょう。私が望むのは、Personクラスでのみこれを変更できることです。自動的に変更されます。私がそうした場合、私は今、PersonRepository.Get()メソッドを編集する必要はありませんが、私のDetails()メソッドを変更する必要があります。

私のようなものを探していた

:これは何も変更する可能性がある場合ああ、ところで、この「詳細」方法は、別のアセンブリに配置されます

Details(Person.IdType id) { /*...*/ } 

...

が、強く型付き型または参照型のいずれかを受け入れる必要があります。

アイデア?

ありがとうございます!

答えて

1

これがあなたの望むものなのかどうかは分かりません。

public T Get<T>(Func<Person,T> property) { 
    return property(myPerson); 
} 

をし、それを呼び出します:あなたは、メソッドがFunc<Person,T>を取ると、それはあなたのための型を推論持つことができます

var id = PersonRepository.Get(p => p.Id); 

コンパイラは、ラムダ式からTの種類を推測することができます。

+0

正確にはそうではありませんが、リポジトリの部分は機能しません。問題は、私のドメインモデルの範囲外の他の方法です。私はラムダ式で何かを試みます。ありがとう! –