2

C# 中的每个对象都有可能作为 ToString() 流式传输到字符串。考虑到最初生产的字符串,是否有一个衬垫可以逆转这个过程?

所以:

var stringSomeObject = SomeObject.ToString();

然后反转:

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

4 回答 4

16

考虑到最初生产的字符串,是否有一个衬垫可以逆转这个过程?

不。每种类型都可以选择ToString()以任何方式实现愿望。这使得不可能任意往返该值。

往返于某些其他表示的对象通常是通过框架对对象序列化的支持来处理的。

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

于 2013-04-11T22:03:31.563 回答
3

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

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

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

于 2013-04-11T22:05:22.597 回答
1

您实际上想要序列化和 dserialise 对象。

谷歌'c# serialise',你会发现很多你可以使用的东西。

例如 xmlserialiser、datacontractserialiser、jsonserialiser 或 binaryformator

我认为 jsonserialiser 是您想要的,它将对象序列化为 json 字符串,

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

于 2013-04-11T22:06:28.510 回答
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

因此,如果无法转换字符串,则将返回该类型的默认值。可以在此处找到每种类型的默认值:默认值表(C# 参考)

如果 MS 可以添加 int.FromString(string) 方法作为 .net 框架的一部分,那就太好了,但是如果您愿意,您可以为每种数据类型添加自己的扩展方法(尽管可能不值得努力)

于 2018-09-28T10:16:07.490 回答