У меня есть метод расширения, который позволяет пользователю отключать ленивую загрузку.Как написать метод расширения для возврата используемого типа?
public static IBaseEntityService<TEntity, TPrimaryKey> EnableLazyLoading<TEntity, TPrimaryKey>(
this IBaseEntityService<TEntity, TPrimaryKey> baseService,
bool enabled)
where TEntity :Entity<TPrimaryKey> where TPrimaryKey : struct
{
baseService.UnitOfWork.EnableLazyLoading(enabled);
baseService.UnitOfWork.EnableProxyCreation(enabled);
var type = baseService.GetType().;
return (type)baseService;
}
Вот пример базового интерфейса:
public interface IBaseEntityService<TEntity,TPrimaryKey> :
IBaseService<TEntity, TPrimaryKey>
where TEntity: Entity<TPrimaryKey> where TPrimaryKey : struct
{
TEntity FindByTenantId(Guid tenantId);
IBaseEntitySpecification<TEntity,TPrimaryKey> Specification { get; }
}
Скажем, у меня есть этот сервис, который реализует интерфейс IBaseEntityService<TEntity,TPrimaryKey>
:
public IUserService: IBaseEntityService<User,int>
{
User FindByUserName(string username);
}
Вот что я хочу добиться:
var user = _userService.EnableLazyLoading(false).FindByUserName("someUsername");
Как вы можете видеть в моем примере после EnableLazyLoading(false)
, я могу перейти к методу FindByUserName
. В настоящее время, поскольку он возвращает только IBaseEntityService, у меня нет такой опции.
Я хочу, чтобы метод расширения знал, чтобы вернуть IUserService
, поскольку он реализует IBaseEntityService
. Я знаю, что в какой-то момент мне пришлось бы бросить его, и я хочу избежать необходимости писать конкретную реализацию того же метода EnableLazyLoading
для
Я думал о чем-то подобном, но, похоже, я мог что-то сделать без имея в неявном вызове метода Cast:
public static TEntityService Cast<TEntity, TPrimaryKey, TEntityService>(
this IBaseEntityService<TEntity, TPrimaryKey> baseEntityService)
where TEntity : Entity<TPrimaryKey>
where TPrimaryKey : struct
where TEntityService : IBaseEntityService<TEntity, TPrimaryKey>
{
return (TEntityService) baseEntityService;
}
Так он может работать так:
var user = _userService.EnableLazyLoading(false).Cast<IUserService>().FindByUserName("someUsername");
Приложите больше усилий для форматирования кода в своих вопросах - вы задали более 200 вопросов, поэтому вы должны * действительно * знать, как форматировать сообщения. –
@JonSkeet, я был на самом деле посреди этого, когда вы, вероятно, писали свой комментарий. – DDiVita
Он по-прежнему выглядит сломанным для меня ... –