0

アプリケーションのすべてのエンティティ クラスは、次のインターフェイスを実装する必要があります。

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

ほとんどの場合、T の型は int になります。ただし、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;
    }
}

エンティティ インスタンス (型が不明) が与えられた場合、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を処理するためだけにほぼ同じコードを繰り返さなければならないため、このコードは私には合いません。

誰かが私にもっときれいな解決策を教えてくれれば幸いです。このアプリケーションはまだプロトタイプであり、提案に対して完全にオープンです。ありがとう

4

1 に答える 1

1

インターフェイスを導入IEntityできます:

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

 public interface IEntity {
    object Id { get; }
}

同じ値を返すはずの 2 つのプロパティを実装する際に不便な点がありますが、これはプロパティ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();
于 2012-11-20T11:40:07.823 に答える