Невозможно получить доступ к внутренним классам за пределами DLL, а некоторые открытые переменные недоступны

Мне трудно сделать эту работу.

3 класса FooType, WebApp & IWebApp не должен быть accessbile \ видимым за пределами этой DLL. Итак, отсюда sealed & internal классы.

Проблемы у меня есть...

1) В WebApp учебный класс, FeeType1 недоступен в RouteOneBuilder параметр метода.

2) В WebApp учебный класс, FeeType1 не доступен \ видимый в регистре-переключателе переключателя. (должно быть видно).

3) В WebApp учебный класс, CreditApplication из FeeType1 свойство не видно в регистре-переключателе переключателя (должно быть видно).

Есть ли лучший способ для этого сложного сценария? Я уже облажался для выставления классов за пределами этой DLL? Можно ли по-разному разрешить все шаги с 1 по 4 (или как-то исправить)?

Я не вижу, как я могу сделать это проще.

internal static class FooType
{
    public class FeeType
    {
        public FeeType() { }
        public string CreditApplication = "Credit Application";
        public string CreditVehicle = "Credit Vehicle";
    }
    public FeeType FeeType1
    {
       get { return new FeeType(); }
       private set { }
    }
}    
sealed class WebApp : IWebApp
{
    public string RouteOneBuilder(FooType.FeeType1 typing)
    {
       var xml = "";

       switch(typing)
       {
           case FooType.FeeType1.CreditApplication:
               xml = "asdf";
               break;
           default:
               throw new Exception("Unknown value");
       }

       return xml;
    }
}
internal interface IWebApp  
{
    string RouteOneBuilder(FooType.FeeType typing);
}

2 ответа

Решение

Ваше определение sealed класс неверен. Это не модификатор доступа, как public, private, protected а также internal, Маркировка класса sealed только говорит, что это не может быть inherited от; это ничего не говорит о доступе как таковом.

Из документации MSDN:

При применении к классу модификатор sealed предотвращает наследование других классов от него.

Это означает, что вы все еще можете предоставить public class that is sealed, Однако, если вы попытаетесь унаследовать от sealed класс, вы получите ошибку компилятора, как это:

не может быть получен из закрытого типа 'YourNamespace.YourSealedClass'.


Кроме того, я предлагаю вам прочитать это и это относительно внутренних / общедоступных и вложенных классов.

Теперь, глядя на предоставленный вами код, появляются следующие ошибки компилятора:

FooType.FeeType1 ': невозможно объявить элементы экземпляра в статическом классе

Эта ошибка означает, что если класс объявлен как статический, все члены также должны быть статическими.

FooType.FeeType1 'является' свойством ', но используется как' тип '

Это вытекает из того факта, что класс является статическим, но ни один из членов не является.

Непоследовательная доступность: тип параметра "FooType.FeeType" менее доступен, чем метод "IWebApp.RouteOneBuilder(FooType.FeeType)"

Тип возврата и каждый из типов, на которые есть ссылки в формальном списке параметров метода, должны быть по крайней мере такими же доступными, как и сам метод.

Вы можете найти больше информации о последней ошибке здесь.

Дизайн не правильный.

Если тип помечен как internal это указывает на то, что к нему никогда нельзя обращаться за пределами его DLL. Если этот тип должен быть доступен вне библиотеки DLL, в которой он объявлен, он не должен быть помечен internal,

Какое ограничение мешает вам использовать public модификатор или от включения типов в той же DLL, что и код потребления?

В некоторых случаях это полезно для просмотра внешних DLL или EXE internal Члены объявлены в другой DLL. Один примечательный случай для модульного тестирования. Тестируемый код может иметь internal модификатор доступа, но вашей тестовой DLL все еще требуется доступ к коду для его проверки. Вы можете добавить следующее в AssemblyInfo.cs проекта, содержащего internal члены, чтобы разрешить внешний доступ.

[assembly:InternalsVisibleTo("Friend1a")]

См. InternalsVisibleToAttribute Class для более подробной информации.

Примечание: sealed модификатор доступа не препятствует доступу извне объявленной DLL. Это предотвращает расширение типа другими типами.

Другие вопросы по тегам