C # специфическая видимость для некоторых методов - PullRequest
0 голосов
/ 02 октября 2018

У меня есть два класса в пространстве имен, и эти классы должны вызывать друг друга так:

public class A
{
    void MethodVisibleToB() {}
}
public class B
{
    void MethodVisibleToA() {}
}

Я хочу, чтобы методы не были видны ни внутри dll, ни снаружи.Я хотел, чтобы только класс A видел B.MethodVisibleToA, а только класс B - A.MethodVisibleToA.

Я обычно ограничиваю видимость метода с вложенными классами, но на этот раз это невозможно, а также излишне сложно.Можете ли вы предложить способ запретить вызов этих методов извне?

Опции, которые у меня сейчас есть, не так хороши:

  • сделать все общедоступными (meh),
  • сделать все внутренним и переместить A и B в другую dll (не выполнимо)

Edit : я забыл упомянуть, что классы находятся в одном и том же пространстве имен в одном и том жесборка

Решение : Я принял предложение Мринала Камбоя и реализовал интерфейсы явно:

internal interface IA
{
    void VisibleByB();
}

internal interface IB
{
    void VisibleByA();
}

public class A : IA
{
    void IA.VisibleByB() { }
}

public class B : IB
{
    void IB.VisibleByA() { }
}

Событие более извращенное решение извращенной проблемы :это предотвратит доступ к двум интерфейсам и относительным методам из других классов и даже подклассов:

public static class ClassAreNotMeantToBeUsedThisWay
{
    interface IA
    {
        void VisibleByB();
    }

    interface IB
    {
        void VisibleByA();
    }

    public class A : IA
    {
        void IA.VisibleByB() { }
    }

    public class B : IB
    {
        void IB.VisibleByA() { }
    }
}

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Вы можете пометить методы как internal

Внутренние типы или элементы доступны только в файлах в одной сборке

См.следующий пример:

public class A
{
    internal void MethodVisibleToB() {}
}

public class B
{
    A aInstance = new A();

    internal void MethodVisibleToA() 
    {
        aInstance.MethodVisibleToB(); // this can only be called by methods that are within the same assembly as B
    }
}

Приложение

Если вам нужен доступ к методу извне, вы можете использовать InternalsVisibleToAttribute в сборке, где Aи B расположены.В любом случае, я бы порекомендовал это только для очень ограниченного объема, например (юнит-тесты).Поместите эту строку в любой файл .cs в вашей сборке (без пространства имен)

[assembly: System.InternalsVisibleTo("MyAssembly.Tests")]
0 голосов
/ 02 октября 2018

Попробуйте использовать Интерфейс и реализуйте явно следующее:

interface InterfaceA
{
    void MethodVisibleToB();
}

interface InterfaceB
{
    void MethodVisibleToA();
}

public class A : InterfaceA
{
    void InterfaceA.MethodVisibleToB() { }
}
public class B : InterfaceB
{
    void InterfaceB.MethodVisibleToA() { }
}

Доступ осуществляется следующим образом:

InterfaceA a = new A();
a.MethodVisibleToB();

InterfaceB b = new B();
b.MethodVisibleToA();

этот способ будет доступен при закрытиив типе интерфейса не будет доступен, если не заключен в Interface type, но имеет тип класса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...