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

C# 将用户定义的类型转换为字符串,将字符串转换为用户定义的类型,c#,.net,C#,.net,为什么.NET不提供从字符串到定义类型以及从定义类型到字符串的隐式或显式转换 例如: public class MyClass { public int Id; public MyClass() { } } 我能行: var myClass = new MyClass() {Id=1}; string myClassString = myClass.ToString(); 为什么我做不到?: var myClassConverted = (MyClass) myClassS

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

例如:

public class MyClass
{
  public int Id;

  public MyClass()
  {
  }
}
我能行:

var myClass = new MyClass() {Id=1};
string myClassString = myClass.ToString();
为什么我做不到?:

var myClassConverted = (MyClass) myClassString ;
有任何序列化模式可以实现吗?

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

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

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

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

    没有可用于将
    字符串
    强制转换为类的转换,但您可以定义自己的自定义转换运算符

    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:

    ToString方法的默认实现返回对象类型的完全限定名,如下例所示

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

    如果要序列化或反序列化对象,请查看以下内容:


    您无法将
    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`
    
    当您将
    与string
    方法进行比较时,理想情况下您应该与
    FromString
    方法进行比较,不幸的是,没有这样的事情

    回到你的问题上来

    var myClassConverted = (MyClass)myClassString;
    
    为什么我做不到?:

    var myClass = new MyClass() {Id=1};
    string myClassString = myClass.ToString();
    
    因为
    string
    MyClass
    之间没有隐式或显式转换


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

    当然,您可以定义
    公共静态MyClass Unserialize(字符串s)
    方法。这很不合理吗?这不是ToString()的用途,看看BinaryFormatter、XmlSerializer或DataContractSerializer。您不需要使用序列化程序。您可以定义自己的转换。对于简单类型(数字、枚举、日期时间、字符串),它可以工作:)不,它不能。因为这些对象中的.ToString()方法只返回字符串值,而不是字符串对象。@OndrejSvejdar:以什么方式工作<代码>字符串i=“1”;int j=(int)i将引发编译错误…我的意思是,对于简单类型,.ToString()中的字符串仍然是可反序列化的-即,您可以通过convert static class或Enum.Parse等将实例转换回。多亏了这一点,我将尝试显式运算符;你的答案和@Szymon是我需要的,我想你的帖子在他之前1分钟我会修改并测试代码,我会标记答案,谢谢。