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

时间:2015-01-16 12:14:56

标签: .net architecture

如果调用类没有在.Net(C#)中实现特定接口,如何限制对成员函数的访问权限 例如:
实现 IProfessor 的类只能访问 IStudent.SetGrade 方法。

3 个答案:

答案 0 :(得分:1)

你可以考虑的一个选项,实际上可能有意义,因为大概IProfessor也可以只为他们教授的学生/他们的课程/科目等设定成绩......

IStudent没有SetGrade方法,只有

  

GetGradeSetterFor(IProfessor教授)

返回允许设置适当等级的对象。即包含“业务逻辑”的对象决定了谁可以设置什么。并且通过(例如)将代表或参考传递给私人领域,可以访问学生的私人方法。

实际上,当你允许研究生等等GetGradeSetterFor(IGrader grader)可以实施的成绩时,你可能想要IProfessor

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

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

这些都不会导致传入null的编译时间问题,但是您正在警告开发人员在这种情况下可能需要

答案 1 :(得分:0)

你不能编译时间,而是运行时。

从基类型(IPerson)派生IProfessor,并使用该基类型的实例调用SetGrade。

public SchoolStudent : IStudent
{
    void SetGrade(IPerson, int grade)
    {
         if (IPerson is IProfessor)
         {
            set grade ...
         }
    }
}

public interface IProfessor : IPerson
{
   ...

}

public interface IPerson
{
}

答案 2 :(得分:0)

首先,由于几个原因,这不是好的做法。例如,请参阅IS there any way to get a reference to the calling object in c#?

无视我认为可以使用以下内容:

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