Не найдено пространство имен для пользовательского атрибута C#

У нас есть модель, которая передается с веб-страницы как json и использует построение модели в нашем контроллере для разрешения свойств на нашем сервере .Net Core 3.1. Мы хотим украсить некоторые свойства этой модели пользовательским атрибутом, чтобы «вспомогательный» метод мог выполнять преобразование указанного свойства в нашем контроллере.

Когда у нашей модели НЕТ атрибутов, все компилируется и работает нормально.

Мы создали класс для этой модели (LoginModel) и украсили свойство нашим пользовательским атрибутом [Courier].

namespace THO.Demo.API.Models
{

    public class LoginModel
    {
        public string Email { get; set; }
        [Courier(foo: "secret")]
        public string Secret { get; set; }
        [Courier]
        public string PIN { get; set; }
    }
}

Мы создали класс для пользовательского атрибута

namespace THO.Demo.API.Models
{
    [AttributeUsage(AttributeTargets.Property)]
    public class CourierAttribute : System.Attribute
    {
        private string foobar;
        public CourierAttribute(string foo)
        {
            foobar = foo;
        }

        public CourierAttribute() { }
    }
}

Когда я пытаюсь собрать наш проект, я получаю следующие ошибки:

Ошибка CS0246 Не удалось найти имя типа или пространства имен «CourierAttribute» (вы пропустили директиву использования или ссылку на сборку?)

а также

Ошибка CS0246 Не удалось найти тип или имя пространства имен «Курьер» (вам не хватает директивы использования или ссылки на сборку?)

Оба этих файла находятся «бок о бок» в одном проекте и в одном пространстве имен. Я попытался назвать атрибут «MyCustomAttribute» с той же проблемой. Когда (в VS2019) я нажимаю на атрибут, я вижу ссылку и могу «перейти» к ней, поэтому кажется, что по крайней мере VS знает, что они там есть, но проект не скомпилируется.

Есть предположения? Спасибо.


person twreynol    schedule 03.01.2020    source источник
comment
Вы пытались очистить решение и перестроить, а также перезапустить VS? Часто это происходит из-за плохого обнаружения грязного кода в VS.   -  person toornt    schedule 04.01.2020
comment
Попробуйте очистить проект, закрыть Visual Studio, удалить .vs скрытую папку, открыть Visual Studio, снова пересобрать проект.   -  person Didgeridoo    schedule 04.01.2020
comment
Я закрыл VS 2019, сделал чистое решение, сделал перестроенное решение и не получил никакой радости. Я все еще получаю те же две ошибки.   -  person twreynol    schedule 04.01.2020
comment
Я вернулся к командной строке. Я закрыл VS, сделал чистку дотнета. сделал dotnet сборку. Та же ошибка... :(   -  person twreynol    schedule 04.01.2020
comment
проверьте, нацелены ли оба проекта на одну и ту же .net Framework, если нет, они становятся невидимыми друг для друга.   -  person Holger    schedule 04.01.2020
comment
Кроме того, очистите кеш, если вы используете ReSharper: ReSharper → Options → General → Clear caches. Затем снова откройте Visual Studio, очистите и перестройте решение.   -  person Didgeridoo    schedule 04.01.2020
comment
Мы не используем Resharper. И оба эти файла находятся в одном проекте, который является проектом веб-API .Net Core 3.1. - Ошибки указывают на строку в модели, где мы пытаемся украсить свойство.   -  person twreynol    schedule 05.01.2020
comment
Вы случайно не установили в файле атрибутов значение, отличное от BuildAction = C# compiler?   -  person nvoigt    schedule 06.01.2020


Ответы (1)


Наш способ организации проектов заключается в том, чтобы хранить все наши модели ({projectRoot}/Models) в папке и пространстве имен. Мы также создали папку для «Атрибутов» ({projectRoot}/Attributes), куда мы поместили наш класс атрибутов. Когда я переместил «LoginModel» из папки «Модели» в корневую папку проекта, компилятор смог найти атрибут (даже если мы оставляем класс атрибута в отдельной папке). Это не имеет смысла, так как все, что мы сделали, это переместили файл. Мы не меняли пространство имен. Кажется, это обходной путь, но он нарушает организацию нашего проекта. (Кстати, когда у нас НЕ есть свойство, украшенное атрибутом, модель находится и компилируется правильно). Обновление - проблема «не найдена» была в отдельном проекте (упс) со ссылкой на LoginModel. Как только мы внимательно рассмотрели сообщение об ошибке eaxact и добавили ссылку на класс Attribute, все заработало.

Усвоенный урок — ВНИМАТЕЛЬНО изучите точное сообщение об ошибке.

person twreynol    schedule 06.01.2020