特定の型が ToString をオーバーライドするかどうかを確認するこのアプローチは、少し脆弱だと思います。これは、他のいくつかの方法で解決できます。
まず、文字列表現が必要な場合は、IObjectDescriptor のような追加の mixin インターフェイスを 1 つのメソッド (文字列 GetDescription) で追加できます。また、すべてのタイプからこの実装を要求できます (クラスが実装されていない場合は、例外がスローされます)。
2 番目のアプローチ (既存のコード ベースを変更したくない場合) は、1 つのメソッドを持つ別のヘルパー クラスを使用することです: ConvertToString:
static class ToStringHelper
{
// We can use Generic method to prevent boxing
public string ConvertToString(object o)
{
var sb = new StringBuilder();
// using reflection to access all public properties, for example
return sb.ToString();
}
}
どちらの場合でも、あなたとクライアントの間の意図と「契約」はより明確になります。最初のケースでは、型が特定のインターフェイスを実装していない場合に例外をスローします。2 番目のアプローチでは、少なくとも一貫した動作が得られます。