私は、別のソフトウェア用のAPIとインターフェイスするツールを書いています。私のツールの一部には、APIで見つかったさまざまなオブジェクトに関するレポートを生成する必要があります。これらのレポートに、各オブジェクトを識別する単純な文字列を含める必要があります。デフォルトでは、ToString()を使用して各オブジェクトの文字列を生成する予定です。しかし、驚くことではないが、このAPIのデフォルトのToString()実装は説明的ではないことがわかった。パブリックAPIのクラスのToString()をオーバーライドできますか?
最初は、長いSwitchステートメントで以下のコードを実行することを考えていました。これはおそらく管理不能なほど長くなるだろうが。
public string GetAPIObjectDescrition(object obj)
{
Type t = obj.GetType();
Switch(t)
{
Case typeof(SomeAPIType):
SomeAPIType x = (SomeAPIType)obj;
return x.SomeProperty;
Case typeof(SomeOtherAPIType):
SomeOtherAPITypex = (SomeOtherAPIType)obj;
return x.SomeOtherProperty;
default:
return x.ToString();
}
}
次は拡張メソッド(下記のコードを参照)を使用して試しました。 CustomObjectDescription()は期待どおりに動作しましたが、ToString()を呼び出そうとすると、デフォルトのToString()の結果が返されます。私はこれまで拡張メソッドを使用したことがないので、基本的な考え方から完全に外れる可能性もあります。
APIで発生したすべてのタイプのCustomObjectDescription()拡張があるとは限りません。このルートを使用すると、毎回リフレクションを使用して現在のオブジェクトにGetObjectDescription()拡張。可能であれば、反射の使用を避けたいと思います。
public static class APIObjectDescriptionExtensions
{
public static string ToString(this APIObject element)
{
return "ElementName = " + element.Name + " ElementID =" + element.Id.IntegerValue.ToString();
}
public static string CustomObjectDescription(this APIObject element)
{
return "ElementName = " + element.Name + " ElementID =" + element.Id.IntegerValue.ToString();
}
}
私はこの問題にどのようにアプローチすべきか他に誰かがありますか?私は、各API型のコードが互いに独立しているソリューションを望んでいます(巨大なSwitch文はありません)。
また可能であれば、あるタイプの説明文字列コードが、独自の一意の説明文字列コードを持たない限り、サブタイプに継承することをお勧めします。
カスタムTypeConvertersを作成したり、System.Convert.ToString()をオーバーライド/拡張したりするより良い解決策があると思いますか?
更新
私は下の例は、私が何をしようとしている明確に役立つかもしれないと思います。最終的に私はこのAPIから任意のクラスを取ることができるようにしたい。タイプは実行時まで分からず、記述文字列を生成する。 Typeに私のカスタム拡張メソッドがある場合はそれを使用する必要があります。それ以外の場合は、コードを普通の古いToString()に戻す必要があります。
public static string GetDataDescription(object o)
{
//get the type of the input object
Type objectType = o.GetType();
//check to see if a description extension method is defined
System.Reflection.MethodInfo extensionMethod = objectType.GetMethod("MyDescriptionExtensionMethod");
if (extensionMethod != null)
{
//if a description extension method was found returt the result
return (string)extensionMethod.Invoke(o, new object[] { });
}
else
{
//otherwise just use ToString();
return o.ToString();
}
}
上記のこのコードは、拡張メソッドaren't found by GetMethod()のでかかわらず動作しません。
拡張メソッドを使用してインスタンスメソッドを非表示にすることはできません。これは、コンパイラがメソッド呼び出し式をバインドしようとするとインスタンスメソッドが最初にチェックされるためです。詳細は、仕様(§7.6.5.1)を参照してください。 – jason
インスタンスメソッドは、同じ名前の拡張メソッドの前に常に使用されます(他のすべてが等しい)。したがってToStringを使用することはできません。 – BrokenGlass
可能性のある複製http://stackoverflow.com/questions/4093501/how-do-i-override-tostring-and-implement-generic?rq=1 –