Невозможно получить доступ к внутренним классам за пределами 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. Это предотвращает расширение типа другими типами.