как реализовать LateBinding в C # - PullRequest
4 голосов
/ 27 мая 2011

У меня есть общий класс в этом классе, я написал один метод, который должен принимать объект класса object в качестве параметра.

функция выглядит следующим образом-

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

и я вызываю эту функцию из других классов.но когда я вызываю эту функцию as-

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

, но она показывает ошибку в этой функции.ошибка as-

'object' не содержит определения для 'Show' и не может быть найден метод расширения 'Show', принимающий первый аргумент типа 'object' (вы пропускаете использованиедиректива или ссылка на сборку?)

Как реализовать позднюю привязку в приложении C # windows?

спасибо.

1 Ответ

7 голосов
/ 27 мая 2011

Если вы используете .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);
    }
}
...