C# 如何指定只能从同一程序集的派生类访问的方法?

C# 如何指定只能从同一程序集的派生类访问的方法?,c#,.net,C#,.net,在C#中是否有任何方法可以指定一个方法,该方法只能从同一程序集的派生类访问,而无需使用internalaccess修饰符 谢谢。您必须同时指定内部和受保护。阅读 受保护的受保护的成员可在其类内通过 派生类 内部内部类型或成员只能在 同一程序集中的文件 受保护的内部访问仅限于当前程序集或 从包含 班级。 *受保护的内部是唯一允许的访问修饰符组合 对于成员或类型 所以你需要使用internal关键字: protected internal memberName(){ ... }; 好的!我设想这样

在C#中是否有任何方法可以指定一个方法,该方法只能从同一程序集的派生类访问,而无需使用
internal
access修饰符


谢谢。

您必须同时指定内部和受保护。

阅读

受保护的受保护的成员可在其类内通过 派生类

内部内部类型或成员只能在 同一程序集中的文件

受保护的内部访问仅限于当前程序集或 从包含 班级。 *受保护的内部是唯一允许的访问修饰符组合 对于成员或类型

所以你需要使用
internal
关键字:

protected internal memberName(){ ... };

好的!我设想这样的情况,您希望比使用“internal”关键字更灵活地控制汇编类的来源和派生类。例如,如果要检查对象是否来自th-a-at程序集,并且是否派生自其中一个-e-e-ese类

您可以通过类型为

下面是检查对象是否从另一个派生的方法。

所以你可以检查所有你需要的

然后您可以实现如下功能:

public static bool CheckTypeIsCorrect(Type t)
{
    if(t.GetAssembly().FullName != AssemblyYouNeed) return false;
    if(!(check anything you want in the class)) return false;
    return true;
}
...
public void YourMethod(object value)
{
    if(!CheckTypeIsCorrect(typeof(value))) 
        throw ArgumentException("Type of the object is not correct");
    ...
}
public class OriginalClass { ... }

internal class DerivedClass: OriginalClass
{
    protected void MemberName() { ... }
}

基类中将函数
访问修饰符
设置为
受保护的
。如下

protected void YourFunctionName()
{
//This will be accessible in your derived class only.
}
受保护成员可以从声明该成员的类内以及从声明该成员的类派生的任何类内访问

只有通过派生类类型进行访问时,基类的受保护成员才能在派生类中访问

下面是来自MSDN的一个示例

namespace SameAssembly
{
    public class A 
    {
       protected void abc()
       {
       }
    }

    private class B : A 
    {
       void F() 
       {
          A a = new A();  
          B b = new B();  
          a.abc();   // Error
          b.abc();   // OK
       }
    }
}

我相信你可以做如下事情:

public static bool CheckTypeIsCorrect(Type t)
{
    if(t.GetAssembly().FullName != AssemblyYouNeed) return false;
    if(!(check anything you want in the class)) return false;
    return true;
}
...
public void YourMethod(object value)
{
    if(!CheckTypeIsCorrect(typeof(value))) 
        throw ArgumentException("Type of the object is not correct");
    ...
}
public class OriginalClass { ... }

internal class DerivedClass: OriginalClass
{
    protected void MemberName() { ... }
}
这样,只有内部类才能看到
DerivedClass
,只有内部派生类才能看到其中的移植成员


而且,您仍然可以从任何地方访问
原始类。

将类的范围指定为内部 和方法范围被保护

Internal class Myclass
{
    Protected void MyMethod()
    {
        //Do something
    }
}

使用internal有什么问题?@Mitch:with
internal
该方法在程序集中随处可见。@devdept:问题在于?@Mitch:
internal
破坏了所有OOP规则。@devdept:您看到的大多数代码都破坏了OOP规则。例如,反思!请勾选:对不起,我刚刚勾选了,输入“内部保护”。它可以直接从基类访问。公共类Bar{internal protected void MyFun(){}}Bar f=new Bar();f、 MyFun()@阿卡什·卡瓦:对不起,这解决不了问题。在这里,访问权限仅限于从包含类anywhere派生的当前程序集或类型!!是的,但没有其他办法,这是你能做的最大限度。@devdept,我知道你在说什么,但内部意味着你是所有者,没有必要限制自己在自己的项目中,没有其他办法,您想证明什么?但是我们应该如何仅从派生类访问基类函数?@SQL:您必须将其声明为受保护的
函数。@devdept:这个函数可能满足您的需要。这并不能回答问题。。您需要指定类的访问修饰符..但是这样,您仍然可以从程序集外部的派生类访问它们!我认为,其他人只关心函数访问修饰符。这样,您将访问
MyClass
的所有成员的能力限制为仅访问内部类型!!