C#中的每个对象都有可能像ToString()一样流式传输到字符串。在给出最初生成的字符串的情况下,是否存在可以反转过程的单个衬垫?
所以:
var stringSomeObject = SomeObject.ToString();
然后反转:
var someObjectFromToString = ??????.FromString(stringSomeObject);
答案 0 :(得分:16)
在给出最初生成的字符串的情况下,是否存在可以反转过程的单行程序?
没有。每种类型都可以选择以任何方式实现ToString()
。这使得无法任意往返该值。
然而,框架内的特定类型会实现遵循处理此问题的特定模式的方法。许多默认值类型(Int32
,Double
等)实现了.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)方法,这很不错,但是如果您愿意,可以将自己的扩展方法添加到每种数据类型中(虽然可能不值得这样做)