【发布时间】:2013-11-26 13:28:01
【问题描述】:
我已多次阅读有关 C# 泛型类型参数约束的 MSDN 文档,但我无法弄清楚如何做到这一点,或者确定它是否可能。
假设我有一个这样的通用基类:
public abstract class Entity<TId> { ... }
这个抽象基类没有任何类型约束,TId 可以是任何东西——结构、类等。
现在说我有一个泛型接口方法,我想将方法上的泛型类型约束到上面的类:
public interface ICommandEntities
{
void Update<TEntity>(TEntity entity) where TEntity : ?????;
}
我可以编译这个:
public interface ICommandEntities
{
void Update<TEntity, TId>(TEntity entity) where TEntity: Entity<TId>
}
...但是我需要在执行该方法时显式添加两个 T1 ant T2 通用参数:
commander.Update<AbcEntity, string>(abcEntity);
如果可能的话,我想让编译器推断一切,这样我就可以执行这样的方法:
commander.Update(abcEntity);
这个活动可以吗?到目前为止,我可以让它工作的唯一方法是在泛型基类之上添加一个空的非泛型基类,并将其用作方法的类型约束:
public abstract Entity {}
public abstract EntityWithId<TId> : Entity { ... }
public interface ICommandEntities
{
void Update<TEntity>(TEntity entity) where TEntity : Entity;
}
commander.Update(abcEntity);
...但是我最终得到了一个非常无用的类,它充当标记接口。这是摆脱这种泛型类和接口方法设计的唯一方法吗?还是我在这里遗漏了什么?
【问题讨论】:
-
void DoAbc<TForInterface>(BaseClass<TForInterface> impl);可以,但我不确定这是否是您要找的。span> -
我不明白的是
T2既不是输入参数也不是返回值。 -
您是否考虑过将接口设为通用?
-
void doAbc<T1>(BaseClass<T1> impl)呢? -
在您更新的示例中,我不明白为什么当您有一个基类时您希望您的更新对两个泛型类型进行操作。
void Update<TId>(EntityWithId<TId> entity);是一个足够好的约束,不是吗?EntityWithId是Entity,无需对附加类型参数施加泛型约束。
标签: c# generics type-constraints