根据通用TKey类型生成新ID

时间:2018-11-07 14:11:21

标签: c# asp.net .net inheritance

因此,这是我正在构建的引导类库:

class BaseEntity<TKey>
{
    TKey Id { get; set; }
}

interface ICrudRepository<TItem, TKey> where TItem : BaseEntity<TKey>
{
    void Create(TItem item);
}

class MyCrudRepository<TItem, TKey> : ICrudRepository<TItem, TKey> where TItem : BaseEntity<TKey>
{
    IEnumerable<TItem> _items;

    void Create(TItem item) 
    {
        item.Id = GetNewId();
    }

    TKey GetNewId() 
    {
        // what should I do here?

        // with int, this would be 
        // return _items.Select(x => x.Id).DefaultIfEmpty().Max() + 1;
    }
}

我当前的BaseEntity没有ae TKey参数,它仅使用和INT存储该项目的密钥,但是我如何扩展它以支持泛型类型作为TKey?说Guid? 例如,如何处理新项目的生成(请参见GetNewId)? 如果是序列类型,它应该只使用现有的集合并返回最大的数字,但是在Guid上,即它应该只生成另一个。

完整代码如下:https://gitlab.com/demedos/alexander.jsonorm

1 个答案:

答案 0 :(得分:1)

对于注释,唯一的解决方案是让使用者根据其自身的逻辑及其BaseEntity类型生成ID,因此只需将GetNewId抽象即可。 这是相关代码

public class MyCrudRepository<TItem, TKey....etc
{
    [...]

    public abstract TKey GetNewId();
}