【问题标题】:Convert the user defined type to string and string to user defined type将用户定义类型转换为字符串,将字符串转换为用户定义类型
【发布时间】:2013-11-27 08:46:33
【问题描述】:

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

例子:

public class MyClass
{
  public int Id;

  public MyClass()
  {
  }
}

我能做到:

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

为什么我不能这样做?:

var myClassConverted = (MyClass) myClassString ;

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

【问题讨论】:

  • 你当然可以定义一个public static MyClass Unserialize(string s)方法。这么不合理吗?
  • 这不是 ToString() 的用途,看看 BinaryFormatter、XmlSerializer 或 DataContractSerializer。
  • 您不需要使用序列化程序。您可以定义自己的转化。

标签: c# .net


【解决方案1】:

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

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

  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

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

【讨论】:

  • 它适用于简单类型(数字、枚举、日期时间、字符串):)
  • 不,它没有。因为这些对象的 .ToString() 方法只返回一个字符串值,而不是真正的字符串对象。
  • @OndrejSvejdar:以什么方式工作? string i="1";int j = (int)i; 会抛出编译错误...
  • 我的意思是,对于简单类型,来自 .ToString() 的字符串仍然是可反序列化的 - 即您可以通过 Convert static class 或 Enum.Parse 等将实例转换回。
【解决方案2】:

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 上找到更多信息。

【讨论】:

    【解决方案3】:

    引用msdnObject.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?

    【讨论】:

      【解决方案4】:

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

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

      不允许从MyClass 转换到string 或string 到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 到MyClass 之间没有隐式或显式转换。

      [1]要使其正常工作,您可以使用 implicit 或 explicit 运算符。

      【讨论】:

      • 谢谢,我会尝试显式运算符;你的答案和@Szymon 是我需要的我认为你的帖子比他早 1 分钟我现在会更改并测试代码,我会标记答案非常感谢。
      猜你喜欢
      • 2013-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 2020-03-17
      • 2017-06-22
      • 2019-11-22
      • 1970-01-01
      相关资源
      最近更新 更多