1

汎用インターフェース:

interface IEntity<TKey, TValue>
{
    TKey Key { get; set; }
    TValue Value { get; set; }
}

私のエンティティクラス:

class MyEntity : IEntity<int, string>
{
    public Key { get; set; }
    public Value { get; set; }
}

そして、一般的な方法ですべての可能なエンティティで何かを行う方法:

void MyMethode<T>(T entity) where T : IEntity<int, string> // there is no point, need T parameters
{
    DoEntity(entity.Key, entity.Value);
}

私は次のようなことを達成する必要があります:

void MyMethode<T>(T entity) where T : IEntity<TKey, TValue> // this is not allowed
{
    DoEntity(entity.Key, entity.Value);
}

エンティティに共通のデータベース操作を記述する必要がありますが、キーと値の型がわからないという問題があります。

4

2 に答える 2

3

その場合、次のように定義する必要があります。

void MyMethode<T, TKey, TValue>(T entity) where T : IEntity<TKey, TValue> 
{
    DoEntity(entity.Key, entity.Value);
}

しかし、それは少しクレイジーなようです。

より良いオプションは、IEntityによって継承されるベースを持つことIEntity<TKey, TValue>です。 IEntity値とキーを特定の型としてではなく、オブジェクトとして公開するだけです。

interface IEntity
{
    object Key { get; set; }
    object Value { get; set; }
}

interface IEntity<TKey, TValue> : IEntity
{
    TKey Key { get; set; }
    TValue Value { get; set; }
}

class MyEntity : IEntity<int, string>
{
    int IEntity<int, string>.Key
    {
        get { ... }
        set { ... }
    }

    string IEntity<int, string>.Value
    {
        get { ... }
        set { ... }
    }

    object IEntity.Key
    {
        get { ... }
        set { ... }
    }

    object IEntity.Value
    {
        get { ... }
        set { ... }
    }
}

次に、これを簡単に行うことができます:

void MyMethode<T>(T entity) where T : IEntity
{
    DoEntity(entity.Key, entity.Value);
}
于 2012-06-14T20:22:31.057 に答える
2
void MyMethode<T, TKey, TValue>(T entity) where T : IEntity<TKey, TValue> 
{
    DoEntity(entity.Key, entity.Value);
}
于 2012-06-14T20:21:23.753 に答える