如何反转.ToString()调用

时间:2013-04-11 21:59:57

标签: c# .net

C#中的每个对象都有可能像ToString()一样流式传输到字符串。在给出最初生成的字符串的情况下,是否存在可以反转过程的单个衬垫?

所以:

var stringSomeObject = SomeObject.ToString();

然后反转:

var someObjectFromToString = ??????.FromString(stringSomeObject);

4 个答案:

答案 0 :(得分:16)

  

在给出最初生成的字符串的情况下,是否存在可以反转过程的单行程序?

没有。每种类型都可以选择以任何方式实现ToString()。这使得无法任意往返该值。

通过框架对Object Serialization.

的支持来处理往返于其他表示的往返对象

然而,框架内的特定类型会实现遵循处理此问题的特定模式的方法。许多默认值类型(Int32Double等)实现了.Parse.TryParse方法,可用于从字符串“往返”。这是必须按类型实现的,但不适用于任意类型。

答案 1 :(得分:3)

没有。 ToString()不是带对象的双射 - 也就是说,当对它们调用ToString()时,两个完全不同的对象可以返回相同的字符串。

例如,值“1”和数字1以及我为了返回值“1”而实现的任何类型都返回字符串值“1”。

这种方法返回的任何值?????。FromString()因此不正确,因为如果我调用????。FromString(“1”)并返回数字1,我​​可以抱怨它没有返回重载ToString的类。同样,如果它返回我的类型,我可以抱怨它没有返回整数值1。

答案 2 :(得分:1)

你真的想要序列化和反序列化对象。

Google'c#serialise',您会发现很多可以使用的东西。

例如xmlserialiser,datacontractserialiser,jsonserialiser或binaryformator

我认为jsonserialiser就是你想要的,它将对象串行化为json字符串,

您可以将json字符串反序列化回对象

答案 3 :(得分:0)

您可以创建这样的通用方法:

public static T FromString<T>(string value)
{
    var result = default(T);
    if (value != null)
    {
        try {result = (T)Convert.ChangeType(value, typeof(T));  } catch {}
    }
    return result;
}

并像这样使用它:

string numberstring = "23";   
int myNumber = FromString<Int32>(numberstring);
// myNumber is now 23

numberstring = "notanumber";   
myNumber = FromString<Int32>(numberstring);
// myNumber is now 0

string decimalstring = "3.14159";
int myDecimal = FromString<Decimal>(numberstring);
// myDecimal is now 3.14159

因此,如果无法转换字符串,则将返回该类型的默认值。每种类型的默认值都可以在这里找到:Default values table (C# Reference)

MS可以在.net框架中添加int.FromString(string)方法,这很不错,但是如果您愿意,可以将自己的扩展方法添加到每种数据类型中(虽然可能不值得这样做)