2012-11-20 4 views
0

다음과 같은 인터페이스를 구현해야 내 응용 프로그램의 모든 엔티티 클래스에 공통 회원을 얻기. 그러나 ID가 복합 ID 일 수있는 경우를 처리해야합니다. 예 : 지금의 엔티티 인스턴스 (종류를 알 수없는 경우) 내가 ID를 검색하여 문자열로 변환 할 필요가 주어진는 일반 인터페이스

public class User : IEntity<int> { 
    public int Id { get; set; } 
    ... 
} 

public class Site : IEntity<int> { 
    public int Id { get; set; } 
    ... 
} 

public class UserSite : IEntity<UserSiteIdentifier> { 
    public UserSiteIdentifier Id { get; set; } 
    ... 
} 

// Note: IIdentifier doesn't have any members 
public class UserSiteIdentifier : IIdentifier { 
    public User User { get; set; } 
    public Site Site { get; set; } 
    ... 

    public override ToString() { 
     return User.Id + "|" + Site.Id; 
    } 
} 

: 나는 다음과 같은 구현을 가질 수있다. 나는 말할 수있다 :

object entity = ???; 
string id; 

if (entity is IEntity<int>) 
    id = ((IEntity<int>)entity).Id.ToString(); 
else if (entity is IEntity<IIdentifier>) 
    id = ((IEntity<IIdentifier>)entity).Id.ToString(); 

그러나이 코드는 단지 거의 동일한 코드를 반복적으로 처리해야만 복합 ID를 처리 할 수 ​​있기 때문에 나와 함께 앉지 않는다.

누군가가 내게 더 깨끗한 해결책을 제시 할 수 있으면 감사히 생각합니다. 이 응용 프로그램은 여전히 ​​프로토 타입이며 제안 사항에 완전히 열려 있습니다. 같은 값을 반환 해야하는 두 가지 속성을 구현하면서

public interface IEntity<T>:IEntity { 
    new T Id { get; set; } 
} 

public interface IEntity { 
    object Id { get; } 
} 

일부 불편이있을 것이다 그러나 이것은 object Id을 숨 깁니다 기본 클래스 Entity<T>을 도입함으로써 극복 할 수있다 : 감사

+2

은 왜 그냥 entity.ToString()를 사용? – looper

+0

@looper 감사하지만 객체가 IEntity 을 구현하는지 확인해야합니다. – nfplee

+1

'UserSiteIdentifier'가'IIdentifier'인데도 IEntity 가'IEntity '이라고 결론 내릴 수는 없습니다. 그러면'IEntity '인터페이스가'T' **에서 공 변 ('out') 될 것입니다. 그것은 IEntity 을 만들 수 없습니다. setter도 언급하기 때문입니다. setter는 in-parameter로서'T'를 취하는 메소드와 같습니다. 제가 말하고자하는 것은 위의 'else if'조건이 효과가 있다고 생각하지 않는다는 것입니다. –

답변

1

당신은 IEntity 인터페이스를 도입 할 수 재산.

public class Entity<T>:IEntity<T> { 
    public T Id { get; set; } 
    object IEntity.Id { get{ return Id;} } 
} 

다음 문제가 코드 수 :

object value =...; 
var entity = value as IEntity; 
string id; 
if(entity != null) 
    id = entity.Id.ToString(); 
+0

완벽한 환호성 새싹. – nfplee