C#:扩展泛型类

She*_*kaj 4 c# generics

partial class Repository<TEntity> : IRepository<TEntity> where TEntity : class
{
}
Run Code Online (Sandbox Code Playgroud)

我的通用仓库实施一套共同的方法,TEntity

public TEntity Get(int id)
{
    return _context.Set<TEntity>()
        .Find(id);
}

public TEntity Get(Expression<Func<TEntity, bool>> predicate)
{
    return _context.Set<TEntity>()
}
Run Code Online (Sandbox Code Playgroud)

我可以访问

Repository<User>().Get();
Run Code Online (Sandbox Code Playgroud)

许多存储库执行相同的操作集,因此它是有益的,但现在我想扩展Repository<User>以支持一些额外的行为.

partial class Repository<User> : IRepository<User> 
{
    public user DoMagicFunction()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我可以像使用存储库一样

Repository<User>().DoMagicFunction();
Run Code Online (Sandbox Code Playgroud)

如何为Some扩展相同的泛型类Tentity以扩展新行为而不是修改它.

我本可以做同样的事情,比如创建另一个UserRepository来支持新功能,但访问者会变成

UserRepository.DoMagicFunction();
Run Code Online (Sandbox Code Playgroud)

但我希望它像

Repository<User>().DoMagicFunction();
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 9

您可以使用扩展方法:

public static class ExtensionMethods {

    public static User DoMagicFunction(this Repository<User> repository) {
        // some magic
        return null; //or another user
    } 

}
Run Code Online (Sandbox Code Playgroud)

因此,这将以语法上很好的方式添加函数到Repository<User>对象.

如果你想支持它不仅为UserS,但对于的子类User小号为好,可以使功能通用:

public static class ExtensionMethods {

    public static TEntity DoMagicFunction<TEntity>(this Repository<TEntity> repository)
        where TEntity : User {
        // some magic
        return null; //or another TEntity
    } 

}
Run Code Online (Sandbox Code Playgroud)