2012-11-20 61 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