首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用转换将字符串转换为自定义对象

如何使用转换将字符串转换为自定义对象
EN

Stack Overflow用户
提问于 2017-10-11 09:39:56
回答 2查看 1.9K关注 0票数 5

我在Programming in C#书中找到了以下声明:

IFormattable提供了将对象的值格式化为字符串表示的功能。转换类也使用它来执行相反的操作。

我有课:

代码语言:javascript
复制
class a : IFormattable
{
    private string aa = "123";
    private int bb = 5;

    public string ToString(string format, IFormatProvider formatProvider)
    {
        return $"aa={aa} bb={bb}" ;
    }
}

但是如何将字符串转换为a的对象

UPD:我知道解析的想法。但我的问题是如何使用转换类从字符串创建新对象。

EN

回答 2

Stack Overflow用户

发布于 2017-10-11 09:55:31

你可以提供一个显式转换算子

代码语言:javascript
复制
public class A : IFormattable
{
    public string Aa { get; } = "123";
    public int Bb { get; } = 5;

    public A(){ }

    public A(string aa, int bb)
    {
        this.Aa = aa;
        this.Bb = bb;
    }

    public string ToString(string format, IFormatProvider formatProvider)
    {
        return $"aa={Aa} bb={Bb}";
    }

    public static explicit operator A(string strA)  
    {
        if (strA == null) return null;
        if (!strA.Contains("aa=") || !strA.Contains(" bb=")) return null;
        string[] parts = strA.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries);
        if (parts.Length != 2 || !parts[0].StartsWith("aa=") || !parts[1].StartsWith("bb=")) return null;

        string aa = parts[0].Substring(3);
        string bb = parts[1].Substring(3);
        int bbInt;
        if (!int.TryParse(bb, out bbInt)) return null;
        A a = new A(aa, bbInt);
        return a;
    }
}

示例:

代码语言:javascript
复制
A a = new A("987", 4711);
string toString = a.ToString(null, null);
a = (A) toString;
票数 2
EN

Stack Overflow用户

发布于 2017-10-11 09:46:55

见以下Tims的答案.

我看到您想要将字符串转换为自定义类型。当然,您需要显式地定义这种转换是如何发生的。

您可以实现隐式显式 cast运算符:

代码语言:javascript
复制
public class A
{
   public static implicit operator string(A a)
   {
      // allows: 
      // var a = new A();
      // string x = a;
      return "A converted to string"; 
   } 

   public static explicit operator A(string s)
   {
      // allows: 
      // var s = "something";
      // var a = (A)s;
      return new A(); 
   } 
}

注意:两种方式都可以使用隐式和显式转换。我选择一个显式,另一个隐式的原因仅仅是为了演示。

您可以将此与允许Convert.ChangeType相结合。在幕后,这会将您的值转换为一个IConvertible,然后使用一个开关语句调用正确的转换方法。(见参考源)。请注意,它使用的是TypeCode,而不是类型,因此如果您实现IConvertible.GetTypeCode方法,它也可以在Enum和您自己的类上工作。你可以这样说:

代码语言:javascript
复制
var d = (decimal)System.Convert.ChangeType("17.4", typeof(decimal));

您可以这样包装它,使它的类型更加安全:

代码语言:javascript
复制
static TTargetType ParseTo<TTargetType>(string target)
{
   return (TTargetType)System.Convert.ChangeType(target, typeof(TTargetType));
}

你可以这样用:

代码语言:javascript
复制
var d = ParseTo<decimal>("17.4");

但是,大多数情况下,如果只使用类型本身的解析方法,情况会更好:

代码语言:javascript
复制
var d = decimal.Parse("17.4");
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46684848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档