2012-11-20 47 views
0

在我的應用程序必須實現以下接口的每個實體類獲得一個共同的成員。不過,我必須處理的情況下,身份證可能是一個複合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; 
    } 
} 

現在給出一個實體實例(其中類型是未知的)我需要檢索的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的。

我會很感激,如果有人能給我一個更清潔的解決方案。這個應用程序仍然是一個原型,並完全接受建議。由於

+2

爲什麼不直接使用entity.ToString()? – looper

+0

@looper謝謝,但我需要確保該對象也實現IEntity 。 – nfplee

+1

即使任何'UserSiteIdentifier'是一個'IIdentifier',你不能斷定一個'IEntity '也是'IEntity '。這將要求你的'IEntity '接口在'T' **中是**協變('out')。它不能成爲'IEntity ',因爲它也提到了一個setter。 setter就像是一個以'T'作爲參數的方法。我想說的是,我不認爲你上面的'else if'條件會起作用。 –

回答

1

您可以介紹IEntity接口:

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

public interface IEntity { 
    object Id { get; } 
} 

會有一些不便,同時實施,這是爲了返回相同的值的兩個屬性,但是這可以通過引入基類Entity<T>這將隱藏object Id克服屬性。

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