繁体   English   中英

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

[英]Convert the user defined type to string and string to user defined type

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

例:

public class MyClass
{
  public int Id;

  public MyClass()
  {
  }
}

我可以:

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

为什么我不能做?

var myClassConverted = (MyClass) myClassString ;

是否有任何可以序列化的模式?

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

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

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

我个人使用更多的XML序列化方法,非常容易序列化和反序列化,并且可以与REST或SOAP等外部服务一起很好地工作。

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

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

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

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

您不能真正将ToString()与“显式强制转换”进行比较。 两者的确不同。

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

* [1]不允许从MyClass强制转换为string ,也不允许将string强制转换为MyClass`。

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运算符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM