题
我想这更多的是一种公共言论的,但为什么我不能得到C#来推断我的ID的类型?
public EntityT Get<EntityT>(IdT id) where EntityT : EntityObject<IdT>
和与GUID作为ID的定义EntityObject如下:
public Foo : EntityObject<Guid>
这定义为抽象类EntityObject继承如下:
public abstract class EntityObject<IdT>
{
public IdT id { get; set; }
}
get方法的使用将是如下:
IRepository repository = new Repository();
var hydratedFoo = repository.Get<Foo>(someGuidId);
编辑,以提供进一步的说明。
解决方案
这很难说,因为你只给两个声明,你没有怎么使用它们。是IDT的地方另一种类型的参数? (如果是TId
,那就表明它是 - 但事实上,你正在使用EntityT
另一种类型的参数,违背了公约,建议可能IdT
是也......)
现在,假设IdT
实际上是在你的情况Guid
,应该如何编译工作了,您的意思是Foo
?可能有其它类型的从EntityObject<Guid>
导出。
总之,你有没有给我们足够的信息来肯定告诉任何东西,但它听起来像你基本上使编译器无理要求。
编辑:好的,这是我的猜测,你有什么,使用正常的命名约定:
public interface IRepository
{
TEntity Get<TEntity, TId>(TId id) where TEntity : EntityObject<TId>
}
public abstract class EntityObject<TId>
{
public IdT id { get; set; }
}
public class Foo : EntityObject<Guid> {}
您想要做的:
IRepository repository = GetRepositoryFromSomewhere();
Foo foo = repository.Get<Foo>(someGuid);
尽管目前你要做的:
Foo foo = repository.Get<Foo, Guid>(someGuid);
是,编译器使得它的非常轻微的更难你不是必要的。整整6个额外字符,保持语言简单的缘故和类型推断更容易的规则,了解。
基本上类型推断是全有或全无事务 - 无论是所有的类型参数被推断或它们都不是。这令它简单,因为你不需要去寻找哪些被指定的人,哪些不是。这是问题的一部分,另一部分是,你只能表示对方法的类型参数的约束 - 你不能有:
class Repository<TEntity>
{
TEntity Get<TId>(TId id) where TEntity : EntityObject<TId>
}
,因为这是约束TEntity
,不TId
。再次,这样的事情使得类型推断简单。
现在你的可能的潜在写:
Foo foo = repository.Get(someGuid).For<Foo>();
用适当的方法Get
和一个额外的接口。我想我个人更喜欢只使用Get<Foo, Guid>
虽然。
其他提示
像
一个声明public EntityT Get<EntityT>(IdT id) where EntityT : EntityObject<IdT>
要求该IDT是一个具体类型。如果你想参数IDT为好,你需要使用
public EntityT Get<EntityT, IdT>(IdT id) where EntityT : EntityObject<IdT>
但是,这可能不是你想要的东西。
这就是为什么我所有,但放弃了通用的密钥类型与一般实体。我无法弄清楚如何让我的实体,有通用密钥类型不洒两所有的地方。现在,我已经在整数键解决(这是我反正到处都是),但感觉错了。
如果您的方法签名是这样的:
public TEntity Get<TEntity, TId>(TId id) where TEntity : EntityObject<TId>
在编译器有什么用......
工作您然后调用的东西,如获得:
EDIT(I错):<击>产品P =获取(ID); 击>
Product p = Get<Product, Guid>(id);
Jon的钉这个答案与自己的岗位上去顶,所以我会闭嘴,在我的洞爬回。