通用接口:
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的类型。
答案 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);
}