我已经阅读了有关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通用args:
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);
...但是最后我得到了一个无用的类,它充当了标记接口。这是摆脱这种通用类和接口方法设计的唯一方法吗?还是我在这里想念什么?
检查它可以编译后,我将其升级为答案。
根据您的问题和评论,您希望参数为Entity<Something>
。您无需将参数化类型直接用作类型,可以将其用于参数化。
所以做
public void Update(Entity<T1> entity) where ....
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句