Добавить атрибуты внутри настраиваемого атрибута в С#

Я хочу динамически добавлять атрибуты к свойствам данного класса, потому что проект будет увеличиваться, а процедура полностью повторяется, примерно так:

public class MyAttr : Attribute {
    public MyAttr () {
        foreach(var prop in properties) {
            prop.Attributes.Add([Display(Name =  nameof(prop.Name), ResourceType = typeof(Labels))]);            
        }
    }
}

И используйте его на классах:

[MyAttr]
public class SomeClass {
    public string Name {get; set;}
    public string Description {get; set;}
}

конечно, приведенный выше код не является реальной программой, но я попытался сделать его простым.

Можно ли сделать это? или если нет, есть ли обходной путь?

Обновление: я знаю, что есть атрибут CallerMemberName, который извлекает имя данного свойства, но как получить само свойство и добавить к нему дополнительные атрибуты?


person Hooman    schedule 20.03.2020    source источник
comment
Возможно, было бы проще определить класс с общим свойством и нужными вам пользовательскими свойствами. stackoverflow.com/questions/2587236/generic-property-in -до-диез   -  person Matt    schedule 21.03.2020
comment
@Matt _ Возможно, ссылка, которую вы упомянули, является частью ответа, но другая часть заключается в том, как добавить дополнительные атрибуты к свойству?   -  person Hooman    schedule 21.03.2020
comment
вы просто добавили бы дополнительные свойства экземпляра в пользовательский класс, поддерживаемый общим свойством.   -  person Matt    schedule 21.03.2020
comment
Я проверил, что нового для С# с 6 по 8, и не смог найти ничего нового. docs.microsoft.com/en-us/dotnet/ csharp/whats-new/csharp-8 (там же ссылки на версии 6.0 - 7.3). Поэтому я думаю, что это может быть болезненно достигнуто с помощью пользовательского дескриптора типа: docs.microsoft.com/en-us/dotnet/api/ Первые два предложения многообещающие: Интерфейс ICustomTypeDescriptor позволяет объекту предоставлять информацию о типе самого себя. Обычно этот интерфейс используется, когда объекту требуется информация о динамическом типе.   -  person Oguz Ozgul    schedule 21.03.2020


Ответы (1)


Я думаю, вы могли бы заставить что-то работать, комбинируя приведенные ниже ответы из других сообщений.

Доступ к свойствам объекта из атрибута: Могут ли атрибуты С# получить доступ к цели Класс?

Добавить атрибуты во время выполнения: Как добавить атрибут свойства во время выполнения путем создания новых типов во время выполнения.

Если вы не собираетесь вносить регулярные изменения во все свойства, может быть, лучше заранее справиться с повторяющейся работой. Неизбежно возникают риски/проблемы в будущем, когда вы делаете такие вещи по всем направлениям.

person AEdev52    schedule 20.03.2020
comment
Обратите внимание, что предлагаемый способ предотвращает вызовы new SomeClass (..), поскольку вам нужно будет создавать свои экземпляры с помощью отражения, используя вновь созданный тип. - person Alexei Levenkov; 21.03.2020