从Tuple.ToString()返回的字符串中获取元组

时间:2017-10-20 08:19:17

标签: c# .net

说,我们有那个代码:

var tuple = new Tuple<double, int>(10.6, 2);
var tupleString = tuple.ToString(); //returns "(10.6, 2)";

我们可以从tupleString获取一个新的Tuple实例而无需实现任何自定义解析器和JsonConverters并扩展TypeConverter吗?

更新1
在我的生产代码中,我有SortedList<Tuple<DayOfWeek, double>, double>。该列表由Json.NET序列化,它将字典键转换为.ToString()。然后将JSON发送到前端应用程序。然后前端应用程序使用该序列化密钥向服务器发送请求。我必须将该密钥转换为.NET Tuple,但我不知道该怎么做。

2 个答案:

答案 0 :(得分:4)

当然可以。你可以“简单地”解析输出字符串,但我希望你喜欢编写解析算法然后可能会变得很难,特别是当它涉及字符串和对象时...

例如参见这个,这是不可能解析的:

var tuple = new Tuple<string, int>("10, 6", 2);
var tupleString = tuple.ToString(); //returns "(10, 6, 2)";

我建议先使用元组本身中的项目,而不是先从字符串中删除字符串:

Tuple<int> tuple2 = tuple.Item2;

如果使用JSON.NET对其进行序列化,则应编写或使用自定义序列化程序,如the one mentioned here

答案 1 :(得分:0)

我使用Nate Barbettini的this回答以另一种方式解决了我的问题。 我把他的代码更改为:

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        Type type = value.GetType();
        IEnumerable keys = (IEnumerable)type.GetProperty("Keys").GetValue(value, null);
        IEnumerable values = (IEnumerable)type.GetProperty("Values").GetValue(value, null);
        IEnumerator valueEnumerator = values.GetEnumerator();

        writer.WriteStartObject();
        foreach (object key in keys)
        {
            valueEnumerator.MoveNext();
            writer.WritePropertyName(JsonConvert.SerializeObject(key));
            serializer.Serialize(writer, valueEnumerator.Current);
        }
        writer.WriteEndObject();
    }

然后将自定义JsonConverterAttribute设置为必需的IDictionary&lt;,&gt;并且Json.NET将按JsonConvert.SerializeObject()而不是.ToString()序列化其密钥。因此,Json.NET可以正确地反序列化Tuple。