自定义本地化BooleanConverter

时间:2015-12-08 16:16:29

标签: c# winforms typeconverter typedescriptor propertydescriptor

我正在尝试实现本地化的BooleanConverter。到目前为止,一切运作良好,但当您在该属性上双击时,会显示下一条消息:

“System.String'类型的对象'无法转换为'System.Boolean'类型。”

我认为问题出在TypeConverter的方法CreateInstance中,该方法具有该布尔属性。

public class Json_34159840
{
    public static string JsonStr = @"{""enum"":""1Value"",""name"":""James"",""enum2"":""1""}";

    public static void ParseJson()
    {
        JsonConvert.DefaultSettings = () => new JsonSerializerSettings
        {
            Converters = new List<JsonConverter> { new EnumConverter() }
        };

        // Later on...
        var result = JsonConvert.DeserializeObject<JsonClass>(JsonStr);
        Console.WriteLine(result.Enum);
        Console.WriteLine(result.Enum2);
        Console.WriteLine(result.Name);
    }
}

public class EnumConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var str = value.ToString();
        if (Regex.IsMatch(str, @"^_"))
        {
            writer.WriteValue(str.Substring(1));
        }
        else
        {
            writer.WriteValue(str);
        }
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var value = reader.Value.ToString();
        if (Regex.IsMatch(value, @"^\d+$"))
        {
            return Enum.Parse(objectType, value);
        }

        if (Regex.IsMatch(value, @"^\d+"))
        {
            value = "_" + value;
        }

        return Enum.Parse(objectType, value);
    }

    public override bool CanConvert(Type objectType)
    {
        //You might want to do a more specific check like
        //return objectType == typeof(JsonEnum);
        return objectType.IsEnum;
    }
}

public enum JsonEnum
{
    _0Default,
    _1Value
}

public class JsonClass
{
    public string Name { get; set; }
    public JsonEnum Enum { get; set; }
    public JsonEnum Enum2 { get; set; }
}

1 个答案:

答案 0 :(得分:1)

您的代码的主要问题是您错误地覆盖了GetStandardValues

实际上你不需要覆盖GetStandardValues,只需删除它就可以得到预期的结果,就像原始的布尔转换器一样,同时显示你想要的字符串:

enter image description here

当覆盖GetStandardValues时,您应该返回您为其创建转换器类型的受支持值列表,然后使用ConvertTo提供字符串表示形式值并使用ConvertFrom,提供一种从字符串值转换类型的方法。