将用户定义的类型转换为字符串和字符串转换为用户定义的类型

时间:2013-11-14 11:04:04

标签: c# .net

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

示例:

public class MyClass
{
  public int Id;

  public MyClass()
  {
  }
}

我能做到:

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

为什么我不能做?:

var myClassConverted = (MyClass) myClassString ;

是否存在任何序列化模式?

4 个答案:

答案 0 :(得分:4)

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

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

  1. Create an instance of a class from a string
  2. C# Convert dynamic string to existing Class
  3. Convert class to string to send via email
  4. Converting Class to XML to string
  5. 就个人而言,我使用更多XML序列化方法,非常容易序列化和反序列化,并且可以很好地与外部服务(如REST或SOAP)配合使用。

答案 1 :(得分:3)

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

没有转化可用于向您的班级投放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上找到更多信息。

答案 2 :(得分:1)

引自msdn Object.ToString Method

  

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()不包含当前对象的任何唯一信息,因此您无法从此字符串重建对象。

如果要序列化或反序列化对象,请查看此处:

How to save/restore serializable object to/from file?

答案 3 :(得分:1)

你真的无法将ToString()与“明确的演员阵容”进行比较。两者确实不同。

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

不允许从MyClass转换为stringstring转换为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;

为什么我不能做?:

因为stringMyClass之间没有隐式或显式转换。

[1]为了使其有效,您可以使用implicitexplicit运营商。