私は単純なラッパーを書いて知られているインタフェースに対して「鴨」dynamic
オブジェクトへ:Rubyの `respond_to?`に相当するC#はありますか?
interface IFoo { string Bar(int fred); }
class DuckFoo : IFoo
{
private readonly dynamic duck;
public DuckFoo(dynamic duck)
{
this.duck = duck;
}
public string Bar(int fred)
{
return duck.Bar(fred);
}
}
dynamic
オブジェクトはBar
署名に対応できる場合、これは正常に動作します。しかし、それができない場合は、私がBar
と呼ぶときだけ失敗します。私はそれが速く、すなわち、DuckFoo
ラッパーの構築時に引数の検証で失敗する可能性がある場合、私は好きです。このようなものは:Rubyで
public DuckFoo(dynamic duck)
{
if(/* duck has no matching Bar method */)
throw new ArgumentException("duck", "Bad dynamic object");
this.duck = duck;
}
オブジェクトが特定のメソッド「を有する」かどうかをテストするために使用することができるrespond_to?
方法があります。 C#4の動的オブジェクトでそれをテストする方法はありますか?
(私はduck
の動的な性質は、それが後でメソッドへの応答を停止することができますので、これでもして後で失敗する可能性がバーの呼び出しを確認することを認識しています。)あなたがオブジェクトで利用できるメソッドをチェックすることができ
「duck」が「ダイナミックダック」として宣言されている場合、 'duck.GetType()'を実行するとどうなりますか?それはどんなタイプのものですか? – dtb
動的オブジェクトが.NETオブジェクトの場合は、オブジェクトのタイプが取得されます。 –
私はあなたが動的オブジェクト上のようなリフレクションを行うことはできないと思います...もしそれらが通常のCLRオブジェクトであれば可能ですが、例えばIronRubyからのオブジェクトではできません。 –