4

私はそのクラスに一般的なクラスを持ってobjectいます。クラスのオブジェクトをパラメーターとして受け入れるメソッドを1つ作成しました。

機能は次のとおりです-

protected void AddNewForm(object o )
{
    try
    {
        o.Show();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

そして、私はこの関数を別のクラスから呼び出しています。しかし、この関数を次のように呼び出すと-

Contact objContact=new Contact(); 
AddNewForm(objContact);

しかし、その関数にエラーが表示されます。エラーとして-

'object' には 'Show' の定義が含まれておらず、タイプ 'object' の最初の引数を受け入れる拡張メソッド 'Show' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?)

C# Windows アプリケーションで遅延バインディングを実装する方法は?

ありがとう。

4

2 に答える 2

7

.NET 4 を使用している場合は、新しいdynamicキーワードを使用できます。

protected void AddNewForm(dynamic o)
{
    try
    {
        o.Show();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

.NET 4 を使用しない場合は、リフレクションに頼る必要があります。
次に、次のようになります。

protected void AddNewForm(object o)
{
    try
    {
        o.GetType().GetMethod("Show", new Type[0]).Invoke(o, null);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

ただし、共通のインターフェースを使用することを検討する必要があります。

interface IShowable
{
    void Show();
}

class Contact : IShowable
{
    public void Show() { /* ... */ }
}

protected void AddNewForm(IShowable o)
{
    try
    {
        o.Show();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}
于 2011-05-27T12:41:20.303 に答える