#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)
Комментариев нет:
Отправить комментарий