如何以通用方式对KeyValuePair进行操作?

时间:2012-06-14 20:19:50

标签: c# generics

通用接口:

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);
}

我需要在我的实体上编写常见的数据库操作,但问题是我不知道Key和Value的类型。

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:2)

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