Имя свойства в качестве входных данных для конструктора атрибута
У меня есть собственный атрибут, и я бы хотел, чтобы в качестве входных данных имело имя свойства. Поскольку имя является строкой, это допустимый тип ввода (поскольку атрибуты весьма ограничены в отношении того, что они могут иметь в качестве входных данных для своих конструкторов). Но как я могу это сделать?
Возьмите этот пример кода:
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
}
Немного громоздко, но лучше, чем везде иметь магические строки, и это безопасно для типов, так что ошибки из-за переименований могут быть обнаружены во время компиляции