检索自定义属性内的属性值

时间:2019-05-23 18:10:24

标签: c# .net asp.net-core

现在,我有一个名为Checkbox的属性。我们之所以使用它,是因为在提交复选框值时,我们的前端会显示“开”和“关”,而不是true / false。

我们的目标是解析开/关值,然后将它们转换为true / false,然后再将其转换为JSON转换器,以便可以将它们作为布尔值进行提取。

我已经考虑过使用此属性来处理它。

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

我需要访问checkbox属性内部的属性值,然后需要能够修改该值。

在这里欢迎提出建议和想法。

2 个答案:

答案 0 :(得分:0)

您不能在属性属性中存储每个实例的数据,因为在类上使用反射API时会创建该属性。

您应该使用自定义JSON转换器在字符串值和布尔值之间进行转换。

答案 1 :(得分:0)

正如Martin Ullrich已经建议的那样,您应该考虑使用专用的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.");
        }
    }
}