如何在C#中实现LateBinding

4

我正在上一门关于IT技术的课程,在这门课程中,我编写了一个方法,该方法应该接受object类的对象作为参数。

函数如下:

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'可以找到(您是否缺少使用指令或程序集引用?)

如何在C# Windows应用程序中实现后期绑定?

谢谢。


确保你的第一个类没有任何错误。 - Devjosh
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);
    }
}

@Daniel Hilgarth:我正在使用.NET 4,根据您的回复,我使用了第一段代码,但是它出现了以下错误“无法定义使用'dynamic'的类或成员,因为编译器需要的类型'System.Runtime.CompilerServices.DynamicAttribute'找不到。您是否缺少对System.Core.dll的引用?”第二个错误是-“编译动态表达式所需的一个或多个类型找不到。您是否缺少对Microsoft.CSharp.dll和System.Core.dll的引用?”Controls\frmBaseListView.cs 198 17 MSGBL - Priyanka
@Daniel Hilgarth:我也尝试了第二段代码,但在运行时仍然显示错误——“找到多个匹配项”。 - Priyanka
@Richa:还有...你在项目中引用了提到的DLL吗?! - Daniel Hilgarth
@Daniel Hilgarth:非常感谢您。您的第二段代码在我的应用程序中运行良好。我还要感谢 Stack Overflow 的所有者,因为他们提供了如此精彩的网站。 - Priyanka

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接