仅当调用 class 实现特定接口时才访问方法

Access a Method only if calling class implements specific interface

如果调用 class 未在 .Net (C#) 中实现特定接口,如何限制对成员函数的访问
例如:
实现了IProfessor的class只能访问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
{
}

您可以考虑一个选项,这实际上可能有意义,因为大概 IProfessor 也只能为他们教的学生/在他们的 类 / 科目等中设置成绩...

IStudent 没有 SetGrade 方法,但有

GetGradeSetterFor(IProfessor professor)

其中 returns 允许设置适当等级的对象。也就是说,它是包含 'business logic' 的对象,决定谁可以设置什么。并且可以通过(比如)将委托或引用传递给私有字段来访问学生的私有方法。

实际上,您可能想要一个 GetGradeSetterFor(IGrader grader),因为当您允许研究生等进行评分时,IProfessor 可以实施。

当然你总是可以调用 aStudent.GetGradeSetterFor(null) 但它 与签名中的调用者沟通 他们可能会遇到问题,这是对调用类型的简单运行时检查不是。

您也可以将 IProfessor 作为 SetGrade 的参数,甚至是 IProfessor 中的一个很好的扩展方法,因此 aStudent.SetGrade(aProfessor, args) 变为 aProfessor.SetGrade(aStudent, args)

其中

None 会导致编译时出现传递 null 的问题,但您是在提醒开发人员在这种情况下可能需要 IProfessor

首先,出于以下几个原因,这不是一个好的做法。例如参见 [​​=11=]

无视我认为可以使用类似的东西:

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);
}