Получение значения свойства внутри пользовательского атрибута - PullRequest
0 голосов
/ 23 мая 2019

Прямо сейчас у меня есть атрибут под названием Checkbox.Мы используем его из-за того, что наши сообщения переднего плана «Вкл.» И «Выкл.» Вместо «истина / ложь» при отправке значения флажка.

Наша цель - проанализировать значения вкл / выкл и преобразовать их в true / false, прежде чем они попадут в JSON-конвертер, чтобы их можно было использовать как логическое значение.

рассмотреть возможность использования этого атрибута для обработки этого.

    [Checkbox]
    [JsonConverter(typeof(InvariantConverter))]
    public bool CheckboxInputValue { get; set; }

Мне нужен доступ к значению свойства внутри атрибута флажка, а затем мне нужна возможность изменить значение.

Открыты для предложений и мыслей здесь.

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Как уже предложил Мартин Уллрих, вам следует подумать об использовании специального конвертера JSON.

Я оставил для вас обработку нулевого значения.

public class OnOffStringToBoolConverter : JsonConverter
{
    private readonly Type _sourceType = typeof(string);
    private readonly Type _targetType = typeof(bool);

    public OnOffStringToBoolConverter()
    {

    }

    public override bool CanRead => true;

    public override bool CanWrite => true;

    public override bool CanConvert(Type objectType)
    {
        if (objectType == null)
        {
            throw new ArgumentNullException(nameof(objectType));
        }

        return objectType == _sourceType;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader == null)
        {
            throw new ArgumentNullException(nameof(reader));
        }

        if (objectType == null)
        {
            throw new ArgumentNullException(nameof(objectType));
        }

        if (serializer == null)
        {
            throw new ArgumentNullException(nameof(serializer));
        }

        if (reader.Value == null)
        {
            // Add some null handling logic here if needed.
            throw new JsonSerializationException(
                $"Unable to deserialize null value to {_targetType.Name}.");
        }

        if (string.Compare(reader.Value.ToString(), "On", StringComparison.OrdinalIgnoreCase) == 0)
        {
            return true;
        }

        if (string.Compare(reader.Value.ToString(), "Off", StringComparison.OrdinalIgnoreCase) == 0)
        {
            return false;
        }

        throw new JsonSerializationException(
            $"Unable to deserialize '{reader.Value}' to {_targetType.FullName}. " +
            $"This converter supports only \"On\", \"Off\" values.");

    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        if (writer == null)
        {
            throw new ArgumentNullException(nameof(writer));
        }

        if (serializer == null)
        {
            throw new ArgumentNullException(nameof(serializer));
        }

        if (value == null)
        {
            // Add some null handling logic here if needed.
            throw new JsonSerializationException("Unable to serialize null value.");
        }

        // Write value only if it is boolean type.
        if (value is bool boolValue)
        {
            writer.WriteValue(boolValue ? "On" : "Off");
        }
        else
        {
            throw new JsonSerializationException(
                $"Unable to serialize '{value}' of type {value.GetType().FullName}. " +
                $"This converter supports deserialization of values " +
                $"of {_targetType.FullName} type only.");
        }
    }
}
0 голосов
/ 23 мая 2019

Нельзя хранить данные для каждого экземпляра в свойстве атрибута, поскольку атрибут создается при использовании API отражения в классе.

Для преобразования между строковыми значениями и логическим значением лучше использовать пользовательский конвертер JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...