Имя свойства в качестве входных данных для конструктора атрибута

У меня есть собственный атрибут, и я бы хотел, чтобы в качестве входных данных имело имя свойства. Поскольку имя является строкой, это допустимый тип ввода (поскольку атрибуты весьма ограничены в отношении того, что они могут иметь в качестве входных данных для своих конструкторов). Но как я могу это сделать?

Возьмите этот пример кода:

public class MyCustomAttribute : Attribute {
    public MyCustomAttribute(string propertyName) {}
}

public class Foo {
    public bool MyCustomProperty { get; set; }

    [MyCustom(SomeMagicAppliedToMyCustomProperty)] // I want the attribute to receive something along the lines of "Foo.MyCustomProperty"
    public void Bar();
}

Как я могу сделать это с ограничениями того, что атрибут может получить в своем конструкторе?

4 ответа

Решение

Это невозможно. Атрибуты могут принимать только константы, просто поместите свое имя MyCustomProperty в кавычки в Атрибут.

В C#-6.0 nameof() есть новая функция, которая дает имя конкретного свойства, переменной, класса и т. Д. В виде строки,

http://www.c-sharpcorner.com/UploadFile/7ca517/the-new-feature-of-C-Sharp-6-0-nameof-operator/ https://msdn.microsoft.com/en-us/magazine/dn802602.aspx

Вы также можете использовать CallerMemberNameAttribute https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.callermembernameattribute.aspx

public CustomAttribute([CallerMemberName] string propertyName = null)
{
    // ...
}

Я использовал это в приложении MVC5 с C#6

private const string jobScheduleBindingAllowed = nameof(JobSchedule.JobId) + ", " + nameof(JobSchedule.Time) + ", " + nameof(JobSchedule.EndTime) + ", " + nameof(JobSchedule.TimeZoneId);

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

[HttpPost]
public ActionResult CreateJobSchedule([Bind(Include = jobScheduleBindingAllowed)]JobSchedule jobSchedule)
{
    // stuff
}

Немного громоздко, но лучше, чем везде иметь магические строки, и это безопасно для типов, так что ошибки из-за переименований могут быть обнаружены во время компиляции

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