我在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类从字符串创建新对象。
答案 0 :(得分: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;
答案 1 :(得分:1)
见Tims的回答。
我发现您要将字符串转换为自定义类型。 当然,您需要明确定义此转换的方式。
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");