Я пытаюсь получить доступ к методу, который помечен как внутренний в родительском классе (в его собственной сборке) в объекте, который наследуется от того же родителя.
Позвольте мне объяснить, что я пытаюсь сделать ...
Я хочу создать классы Service, которые возвращают IEnumberable с базовым списком в не-Service классы (например, пользовательский интерфейс) и, необязательно, возвращают IEnumerable с базовым IQueryable другим сервисам.
Я написал некоторый пример кода, чтобы продемонстрировать, что я пытаюсь выполнить, как показано ниже. Пример не является реальной жизнью, поэтому, пожалуйста, помните это при комментировании.
Все сервисы наследуются от чего-то подобного (показан только соответствующий код):
public class ServiceBase<T>
{
protected readonly ObjectContext _context;
protected string _setName = String.Empty;
public ServiceBase(ObjectContext context)
{
_context = context;
}
public IEnumerable<T> GetAll()
{
return GetAll(false);
}
//These are not the correct access modifiers.. I want something
//that is accessible to children classes AND between descendant classes
internal protected IEnumerable<T> GetAll(bool returnQueryable)
{
var query = _context.CreateQuery<T>(GetSetName());
if(returnQueryable)
{
return query;
}
else
{
return query.ToList();
}
}
private string GetSetName()
{
//Some code...
return _setName;
}
}
Унаследованные сервисы будут выглядеть так:
public class EmployeeService : ServiceBase<Employees>
{
public EmployeeService(ObjectContext context)
: base(context)
{
}
}
public class DepartmentService : ServiceBase<Departments>
{
private readonly EmployeeService _employeeService;
public DepartmentService(ObjectContext context, EmployeeService employeeService) : base(context)
{
_employeeService = employeeService;
}
public IList<Departments> DoSomethingWithEmployees(string lastName)
{
//won't work because method with this signature is not visible to this class
var emps = _employeeService.GetAll(true);
//more code...
}
}
Поскольку жизни родительского класса можно использовать повторно, он будет жить в другой сборке, чем дочерние службы. Поскольку GetAll (bool returnQueryable) помечен как внутренний, дочерние элементы не смогут видеть метод GetAll (bool) друг друга, а только открытый метод GetAll ().
Я знаю, что могу добавить новый внутренний метод GetAll для каждой службы (или, возможно, промежуточный родительский класс в той же сборке), чтобы каждая дочерняя служба в сборке могла видеть метод друг друга; но это кажется ненужным, поскольку функциональность уже доступна в родительском классе.
Например:
internal IEnumerable<Employees> GetAll(bool returnIQueryable)
{
return base.GetAll(returnIQueryable);
}
По сути, я хочу, чтобы службы имели возможность доступа к другим методам служб как IQueryable, чтобы они могли дополнительно уточнить незафиксированные результаты, в то время как все остальные получают простые старые списки.
Есть идеи?
EDIT
Знаете, я немного повеселился, играя в небольшой гольф-код с этим ... но в конечном итоге я не смог бы использовать эту схему в любом случае, потому что я пропускаю интерфейсы, а не классы.
Так что в моем примере GetAll (bool returnIQueryable) не будет в интерфейсе, а это значит, что мне придется выполнять приведение типов, что противоречит тому, что я пытаюсь выполнить.
Я не уверен, был ли у меня пердеть мозг или я был слишком взволнован, пытаясь получить что-то, что, как мне казалось, было полезно для работы. В любом случае, спасибо за ответы.