Страницы

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

пятница, 10 января 2020 г.

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

#c_sharp #рефлексия #attribute


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

По умолчанию - есть некоторый диапазон для изменения, условно -+20%.

Но для некоторых переменных есть свои особенности: -10%/+20% или 0..100. Это исключения,
они не многочисленны, но они есть.

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

public int Length;

// Min: 0. Max: 100
public int Size;

[Range:20%]
public int Weight;


Чтобы было более наглядно: у Unity3D есть HideInInspector. Что-то похожее хочу сделать,
но более информативно.
    


Ответы

Ответ 1



Используйте для этого кастомные классы атрибутов, они для того и созданы, чтобы предоставлять мета-информацию об объектах в отражениях. Например, вот атрибут, позволяющий задавать диапазон для полей: [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)

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

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