Страницы

Поиск по вопросам

среда, 27 февраля 2019 г.

Свой атрибут/описание для public поля класса

Есть у меня классы, у них открытые переменные. Я через reflection добираюсь до их значений для последующего отображения/изменения.
По умолчанию - есть некоторый диапазон для изменения, условно -+20%.
Но для некоторых переменных есть свои особенности: -10%/+20% или 0..100. Это исключения, они не многочисленны, но они есть.
Мне хочется, когда буду перебирать переменные, чтобы можно было прямо в коде задать для переменной свой атрибут или не знаю как это называется - описание, которое я мог бы пропарсить:
public int Length;
// Min: 0. Max: 100 public int Size;
[Range:20%] public int Weight;
Чтобы было более наглядно: у Unity3D есть HideInInspector. Что-то похожее хочу сделать, но более информативно.


Ответ

Используйте для этого кастомные классы атрибутов, они для того и созданы, чтобы предоставлять мета-информацию об объектах в отражениях.
Например, вот атрибут, позволяющий задавать диапазон для полей:
[AttributeUsage(AttributeTargets.Field)] class RangeAttribute : Attribute { public int Percent { get; set; }
public RangeAttribute (int percent) { Percent = percent; } }
Задавать значение диапазона на поле можно так:
class Foo { [Range(20)] public int Bar; }
Ну а дальше — отражения:
FieldInfo barField = typeof(Foo).GetField("Bar"); RangeAttribute barRange = barField.GetCustomAttribute(); int range = barRange != null ? barRange.Percent : 20; var foo = new Foo(); barField.SetValue(foo, 10);
См.:
Attributes Tutorial (MSDN) Writing Custom Attributes (MSDN) Creating Custom Attributes (MSDN)

Комментариев нет:

Отправить комментарий