2009-09-01 16 views
1

제네릭 형식 매개 변수에 관한 질문이 있습니다.일반 매개 변수 유형

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

의 더 가자과 :

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

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

이의 내가 사람의 세부 정보를 볼 수있는 방법을 만들려는 이제 가정 해 봅시다 :

의 내가 내 도메인 모델에서 사용되는 용어의 정의는 다음 있다고 가정 해 봅시다 PersonRepository리포지토리의 전문어로 올바른 "강력한"형식의 id 인수 (i)를 허용하기 위해 "Get"메서드가 "자동으로"구현되도록합니다. 이 경우, long 인수).


이제 내가 사람의 ID를 GUID를을해야한다는 결정 일일 가정 해 봅시다. 필자가 원하는 것은 Person 클래스에서만 이것을 바꿀 수 있고 다른 곳에서는 자동으로 변경됩니다. PersonRepository.Get() 메서드를 편집 할 필요는 없지만 Details() 메서드를 변경해야합니다.

내가 좋아하는 뭔가를 찾고 있었다

:

Details(Person.IdType id) { /*...*/ } 
이 아무것도 변경 될 경우

아, 그런데,이 "세부 사항"방법은, 다른 어셈블리에 위치 할 것입니다 ...

하지만 강력하게 -typed이며 값 유형 또는 참조 유형을 허용해야합니다.

아이디어가 있으십니까?

감사합니다.

답변

1

내가 원하는지 확실하지 않습니다.

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

와 함께 전화 : 당신은 방법은 Func<Person,T>을 가지고 당신을 위해 유형을 추론이있을 수

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

컴파일러는 람다 식에서 T의 유형을 추론 할 수있다.

+0

정확히는 아닙니다. 저장소 부분은 기능이 없어도 괜찮습니다. 문제는 내 도메인 모델 범위를 벗어나는 다른 방법 때문입니다. 나는 람다 식으로 뭔가를 시도 할 것이다. 감사! –