.net 仅当调用类实现特定接口时才访问方法
如果调用类没有在.Net(C#)中实现特定接口,如何限制对成员函数的访问.net 仅当调用类实现特定接口时才访问方法,.net,architecture,.net,Architecture,如果调用类没有在.Net(C#)中实现特定接口,如何限制对成员函数的访问 例如: 实现IProfessor的类只能访问IStudent.SetGrade方法。您不能在编译时执行,只能在运行时执行 从基类型(IPerson)派生IProfessor,并使用该基类型的实例调用SetGrade public SchoolStudent : IStudent { void SetGrade(IPerson, int grade) { if (IPerson is IPr
例如:
实现IProfessor的类只能访问IStudent.SetGrade方法。您不能在编译时执行,只能在运行时执行 从基类型(IPerson)派生IProfessor,并使用该基类型的实例调用SetGrade
public SchoolStudent : IStudent
{
void SetGrade(IPerson, int grade)
{
if (IPerson is IProfessor)
{
set grade ...
}
}
}
public interface IProfessor : IPerson
{
...
}
public interface IPerson
{
}
你可以考虑的一个选项,这可能是有意义的,因为大概<>代码>教授< /代码>也可以只为他们所教的学生/他们的班级/科目等等设置等级。
IStudent
没有SetGrade
方法,而是
GetGradeSetterFor(IProfessor教授)
它返回一个允许设置适当等级的对象。也就是说,该对象包含决定谁可以设置什么的“业务逻辑”。通过(比如)将委托或引用传递给私有字段,可以访问学生的私有方法
实际上,您可能需要一个getgradesetter(IGrader-grader)
,当您允许研究生等对IProfessor
可以实施的评分时
当然,您始终可以调用aStudent.GetGradeSetterFor(null)
,但它在与调用方进行通信时,在签名中,调用方可能会遇到问题,而对调用类型进行简单的运行时检查并不是这样
您也可以将IProfessor
作为SetGrade
的一个参数,甚至可以在IProfessor中使用一个很好的扩展方法,这样aStudent.SetGrade(aProfessor,args)
就变成了aProfessor.SetGrade(aStudent,args)
所有这些都不会导致传入null时出现编译时问题,但您正在提醒开发人员,在这种情况下可能需要IProfessor。首先,由于以下几个原因,这不是一种好的做法。例如,见 尽管如此,我认为通过以下方式是可能的:
void IStudent.SetGrade(int grade)
{
StackFrame frame = new StackFrame(1);
var method = frame.GetMethod();
var matchingInterface = method.DeclaringType.FindInterfaces(MatchType, null).ToList();
if (matchingInterface.Count > 0)
{
//...
}
}
private bool MatchType(Type m, object filterCriteria)
{
return m == typeof(IProfessor);
}
作为记录,我比我的答案更喜欢这个解决方案。我在VisualStudio user voice中建议了这个想法