これが私がやりたいことです...
public class A
{
public string Content { get; set; }
}
A a = new A();
a.Content = "Hello world!";
string b = a; // b now equals "<span>Hello world!</span>"
だから私はどのよう a
に変換されるかを制御したいString
…どういうわけか…
これが私がやりたいことです...
public class A
{
public string Content { get; set; }
}
A a = new A();
a.Content = "Hello world!";
string b = a; // b now equals "<span>Hello world!</span>"
だから私はどのよう a
に変換されるかを制御したいString
…どういうわけか…
クラスの暗黙的および明示的なキャスト演算子を手動でオーバーライドできます。チュートリアルはこちら。ただし、ほとんどの場合、デザインが悪いと主張します。あなたが書いた方が何が起こっているのか分かりやすいと思います
string b = a.ToHtml();
しかし、それは確かに可能です...
public class A
{
public string Content { get; set; }
public static implicit operator string(A obj)
{
return string.Concat("<span>", obj.Content, "</span>");
}
}
これをお勧めしない理由の例を挙げると、次の点を考慮してください。
var myHtml = "<h1>" + myA + "</h1>";
上記は、利回り"<h1><span>Hello World!</span></h1>"
ここで、別の開発者がやってきて、上記のコードが見栄えが悪いと考え、次のように再フォーマットします。
var myHtml = string.Format("<h1>{0}</h1>", myA);
しかし、受け取るすべての引数をstring.Format
内部的に呼び出すToString
ため、暗黙のキャストを扱う必要がなくなり、その結果、他の開発者は結果を次のように変更します。"<h1>myNamespace.A</h1>"
public class A
{
public string Content { get; set; }
public static implicit operator string(A a)
{
return string.Format("<span>{0}</span>", a.Content);
}
}
public static implicit operator string(A a)
{
return "foo";
}
ToString()をオーバーライドするのは良い方法です。さらに、デバッグモードでは、ToString()の戻り値に関するヒントが得られます。