我想这更多的是一种公共言论的,但为什么我不能得到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的钉这个答案与自己的岗位上去顶,所以我会闭嘴,在我的洞爬回。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top