0

为什么 .NET 不提供从字符串到定义类型以及从定义类型到字符串的隐式或显式转换?

例子:

public class MyClass
{
  public int Id;

  public MyClass()
  {
  }
}

我可以:

var myClass = new MyClass() {Id=1};
string myClassString = myClass.ToString();

为什么我不能这样做?:

var myClassConverted = (MyClass) myClassString ;

是否存在任何序列化模式可以做到这一点?

4

4 回答 4

4

.ToString()只是一个方法,它可以返回任何字符串值,这不会将类转换为字符串。

我们已经有一些关于将类转换为文本的问题:

  1. 从字符串创建类的实例
  2. C#将动态字符串转换为现有类
  3. 将类转换为字符串以通过电子邮件发送
  4. 将类转换为 XML 到字符串

就我个人而言,我更多地使用 XML 序列化方法,非常容易序列化和反序列化,并且与外部服务(如 REST 或 SOAP)配合得很好。

于 2013-11-14T11:06:30.833 回答
3

ToString()是在类上定义的方法,Object它返回一个新的字符串实例,而不是类型转换。

没有可用于将 a 转换String为您的类的转换,但您可以定义自己的自定义转换运算符。

public class MyClass
{
    public int Id;

    public MyClass()
    {
    }

    public static explicit operator MyClass(string s)
    {
        MyClass temp = new MyClass() { Id = Int32.Parse(s) }; 
        // you should handle exceptions when string is not convertible to int
        return temp;
    }
}

然后,您可以使用您的转换:

MyClass c = (MyClass)("1");

来自 MSDN:

C# 使程序员能够在类或结构上声明转换,以便类或结构可以转换为和/或从其他类或结构或基本类型转换。转换的定义类似于运算符,并以它们转换成的类型命名。要转换的参数的类型或转换结果的类型(但不能同时是两者)必须是包含类型。

转换运算符具有以下属性:

  • 声明为隐式的转换会在需要时自动发生。

  • 声明为显式的转换需要调用强制转换。

  • 所有转换都必须声明为静态。

您可以在MSDN上找到更多信息。

于 2013-11-14T11:10:35.393 回答
1

引用 msdn Object.ToString 方法

ToString 方法的默认实现返回 Object 类型的完全限定名称,如以下示例所示。

using System;

public class Example
{
   public static void Main()
   {
      Object obj = new Object();
      Console.WriteLine(obj.ToString());
   }
}
// The example displays the following output:
//      System.Object

.ToString()不包含您当前对象的任何唯一信息,因此您无法从此字符串重建对象。

如果你想序列化或反序列化你的对象,请看这里:

如何在文件中保存/恢复可序列化对象?

于 2013-11-14T11:12:46.947 回答
1

您无法真正ToString()与“显式演员表”进行比较。两者确实不同。

合理的比较应该是这样的。您应该尝试将“MyClass 转换为字符串”,这将失败。

不允许从MyClasstostringstringto MyClass` 转换。*[1]

var myClass = new MyClass() {Id=1};
string myClassString = (string)myClass;//Note this also will fails since no conversion beween  `MyClass` to `string`

当您ToString理想地比较方法时,您应该与FromString方法进行比较,不幸的是没有这样的事情。

回到你的问题

var myClassConverted = (MyClass)myClassString;

为什么我不能这样做?:

string因为to之间没有隐式或显式转换MyClass

[1]要使其工作,您可以使用 implicitorexplicit运算符。

于 2013-11-14T11:13:57.843 回答