У меня проблема с Visual Studio 2015 и Framework 4.6.1.
У меня есть бизнес-уровень с этим пространством имен: BusinessLayer.LocalStorage. В этом классе (с именем LocalStorage) у меня есть эта функция:
...
public static void XXX()
{
}
...
В основном проекте с таким же Framework 4.6.1 у меня в одной Winform
using BusinessLayer.LocalStorage;
В Load я написал функцию, но ссылка не распознается:
Я должен добавить LocalStorage раньше:
LocalStorage.LocalStorage.XXX();
Таким образом, вызов работает
Почему не работает LocalStorage.XXX()? Я объявил свое пространство имен в предложениях использования. Тогда должно работать.
У меня есть класс в каталоге внутри проекта BusinessLayer, поэтому пространство имен по этой причине должно быть BusinessLayer.LocalStorage.
Код:
namespace BusinessLayer.LocalStorage
{
public class LocalStorage
{
...
public static void XXX()
{
}
...
}
}
Помните, что класс находится внутри каталога с именем LocalStorage, поэтому пространство имен — BussinessLayer.LocalStorage. Я добавил код класса
Полное имя вашего класса — BussinessLayer.LocalStorage.LocalStorage, и одно только LocalStorage неоднозначно, LocalStorage.LocalStorage — нет. Я бы посоветовал вам переименовать или другое, поскольку наличие пространства имен и класса внутри с одним и тем же именем означает, что нет четкого различия между обязанностями пространства имен (группа функций) и класса (одна часть функциональности).
Visual Studio автоматически создает пространства имен на основе текущего местоположения класса в решении. Когда вы создаете новый класс, он сначала получает имя проекта. Затем он берет текущую папку, в которой находится класс. Он будет продолжать добавлять имя папки к пространству имен, пока не достигнет самого имени класса.
Так, например, если у вас есть проект под названием ExampleProject с папкой Models и классом внутри BaseModel.cs, результирующее пространство имен будет ExampleProject.Models
Убедитесь, что пространство имен, содержащее XXX, не является LocalStorage.LocalStorage и называется BusinessLayer.LocalStorage. Вы можете изменить это пространство имен на любое другое и перестроить свой проект.
«результирующее пространство имен будет ExampleProject.Models.BaseModel». На самом деле результирующее пространство имен будет ExampleProject.Models, которое содержит класс BaseModel, поэтому using ExampleProject.Models даст вам доступ к BaseModel.
Это потому, что LocalStorage неоднозначно, это может быть либо пространство имен LocalStorage, либо класс LocalStorage. Вы можете решить это тремя способами:
Полностью удалите пространство имен LocalStorage и переместите все в нем внутрь пространства имен BusinessLayer
Переименуйте класс LocalStorage во что-то другое
Добавьте using LocalStorage = BusinessLayer.LocalStorage.LocalStorage в начало вашего файла, где вам нужно использовать класс LocalStorage
Редактировать: вариант 4. Если вы отчаянно хотите сохранить структуру каталогов в том виде, в котором она есть сейчас (с каталогом LocalStorage), вы также можете указать Visual Studio, что каталог LocalStorage не является поставщиком пространства имен. Вы можете сделать это, отредактировав свойства папки в обозревателе решений.
Я попробовал это, мне не нравится эта идея, потому что я хотел бы использовать только имя класса, когда я вызываю его с использованием clausule. Странное было поведение. Конечно, он работает с псевдонимом.
Основная проблема заключается в том, что у вас есть пространство имен и класс с одинаковыми именами, из-за чего компилятор не может узнать, что вы имеете в виду в любом заданном месте, поэтому нет странного поведения, только предполагаемое поведение.
@David, я только что отредактировал свой ответ, включив в него четвертый вариант, который может лучше соответствовать вашим потребностям.
Я буду использовать этот метод, после теста он лучший (это я делал, прежде чем спрашивать)
Хотя не рекомендуется, чтобы структура пространства имен и имена объектов были одинаковыми, что во многих случаях приведет к ошибкам, я вижу, что вы хотите использовать это таким образом из сделанных вами комментариев.
Я не рекомендую вам называть класс как его пространство имен, см. эту статью
Я бы порекомендовал бы <XYZ>LocalStorage.cs
Я не знаю структуру вашего слоя, но вы можете назвать его LocalStorage.XXX() со структурой, подобной приведенной ниже.
Структура бизнес-уровня:
Класс локального хранилища:
namespace BusinessLayer.LocalStorage
{
public class LocalStorage
{
public static void XXX()
{
}
}
}
И, наконец, после ссылки BusinessLayer на winForm вы можете вызвать его в методе Load следующим образом.
using System;
using BusinessLayer.LocalStorage;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
LocalStorage.XXX();
}
}
}
Или, если вам не нужна папка в структуре BusinessLayer, вы можете использовать ее, используя то же пространство имен (namespace BusinessLayer.LocalStorage), как показано ниже.
Можете ли вы показать код для вашего класса LocalStorage и вашего основного класса?