gpt4 book ai didi

c# - 如何在 C# 中访问后代对象的内部方法

转载 作者:行者123 更新时间:2023-11-30 22:46:33 25 4
gpt4 key购买 nike

我正在尝试访问从同一父类继承的对象中的父类(在其自己的程序集中)中标记为内部的方法。

让我解释一下我要做什么...

我想创建服务类,将带有基础 List 的 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) 标记为内部时, children 将无法看到彼此的 GetAll(bool) 方法,只能看到公共(public) GetAll() 方法。

我知道我可以向每个服务(或者可能是同一程序集中的中间父类)添加一个新的内部 GetAll 方法,以便程序集中的每个子服务都可以看到彼此的方法;但这似乎是不必要的,因为该功能已在父类中可用。

例如:

    internal IEnumerable<Employees> GetAll(bool returnIQueryable)
{
return base.GetAll(returnIQueryable);
}

本质上,我想要的是服务能够访问其他服务方法作为 IQueryable,以便它们可以进一步细化未提交的结果,而其他人都得到普通的旧列表。

有什么想法吗?

编辑

你知道吗,我用这个打了一点代码高尔夫很有趣……但最终我还是无法使用这个方案,因为我传递的是接口(interface),而不是类。

因此在我的示例中,GetAll(bool returnIQueryable) 不会出现在界面中,这意味着我必须进行强制转换,这与我想要完成的目标背道而驰。

我不确定我是不是脑子放屁了,还是我太兴奋了,想要得到一些我认为很适合工作的东西。无论哪种方式,感谢您的回复。

最佳答案

将方法公开的明显答案有什么问题?

无论如何,可访问性都是不安全的,因此“坏人”可以使用反射来绕过您设置的任何修饰符。并且由于您想从不相关的“兄弟”类调用这些方法,因此它们应该是公开的,因为没有“兄弟”可访问性修饰符。

备选建议:应用 [assembly:InternalsVisibleTo("SomeOtherAssembly")] 属性以授予其他业务域程序集访问内部成员的权限。

请注意,这会增加维护负担(如果您重命名或添加程序集),使用“魔术字符串”,并否定内部的原始含义(因为所有内部成员现在对这些其他程序集也是可见的)。

关于c# - 如何在 C# 中访问后代对象的内部方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2603733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com