我正在尝试访问从同一父级继承的对象中在父类(在其自己的程序集中)中标记为内部的方法。
让我解释一下我想要做什么......
我想创建服务类,将带有基础列表的 IEnumberable 返回到非服务类(例如 UI),并可选择将带有基础 IQueryable 的 IEnumerable 返回给其他服务。
我编写了一些示例代码来演示我要完成的工作,如下所示。该示例不是现实生活,因此请在评论时记住这一点。
所有服务都将从这样的东西继承(仅显示相关代码):
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 的形式访问其他服务方法,以便它们可以进一步细化未提交的结果,而其他所有人都可以获得普通的旧列表。
有任何想法吗?
编辑
你知道吗,我用这个玩了一些代码高尔夫很有趣......但最终我无论如何都无法使用这个方案,因为我传递的是接口,而不是类。
因此,在我的示例中,GetAll(bool returnIQueryable) 不会出现在界面中,这意味着我必须进行强制转换,这与我想要完成的事情背道而驰。
我不确定我是不是脑子里放了个屁,或者我只是太兴奋了,想得到一些我认为可以很好用的东西。无论哪种方式,感谢您的回复。