Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 仅当调用类实现特定接口时才访问方法_.net_Architecture - Fatal编程技术网

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

.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

如果调用类没有在.Net(C#)中实现特定接口,如何限制对成员函数的访问
例如:

实现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中建议了这个想法