2017-10-11 65 views
4

發現下面的語句在Programming in C#書:我如何字符串轉換爲自定義對象與轉換

IFormattable提供了一個對象 的值格式化爲一個字符串表示的功能。它也被Convert類用來做相反的事情。

我有類:

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: 我知道解析的想法。但我的問題是如何使用Convert類從字符串創建新的對象。

+3

https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/capitalization-conventions –

+1

與轉換爲字符串相反的是* parsing *。你將不得不解析字符串並從中構造新的'a'對象。 – Sinatr

+0

如果我是你,我會質疑那本編程書。 IFormattable接口僅用於將對象轉換爲其字符串表示形式。從MSDN:'IFormattable接口將對象轉換爲基於格式字符串和格式提供程序的字符串表示形式。' – decPL

回答

1

請參閱下面的Tim答案。

我看到你想要將字符串轉換爲你的自定義類型。 當然,您需要明確定義這種轉換是如何發生的。

您可以實現implicitexplicit轉換操作符:

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,然後使用switch語句調用正確的轉換方法。 (見reference source)。請注意,它使用TypeCode而不是類型,所以它也適用於Enums和您自己的類,如果您實現IConvertible.GetTypeCode方法。 你可以這樣調用它:

var d = (decimal)System.Convert.ChangeType("17.4", typeof(decimal)); 

你可以使它有點類型安全通過包裝它像這樣:

static TTargetType ParseTo<TTargetType>(string target) 
{ 
    return (TTargetType)System.Convert.ChangeType(target, typeof(TTargetType)); 
} 

,你可以使用這樣的:

var d = ParseTo<decimal>("17.4"); 

但大多數情況下,如果只使用類型本身的解析方法,則效果會更好:

var d = decimal.Parse("17.4"); 
2

你可以提供一個explicit conversion operator

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; 
    } 
} 

樣品:

A a = new A("987", 4711); 
string toString = a.ToString(null, null); 
a = (A) toString;