动态函数没有看到扩展对象的方法

时间:2016-03-30 18:06:54

标签: c#

我有一个函数可以处理两个我无法访问的不同对象,因为它们位于两个不同的库中。我正在使用的两个对象具有相同的方法,GetElementValue()总是返回一个字符串,因为我扩展了其中一个对象来执行此操作。下面是动态函数的示例,它与扩展名在同一名称空间中但在两个不同的类文件中(注意:这是REST API中使用的自定义C#库):

private void SetContentDynamic(dynamic xmlElement)
{
    //Defaults
    this.Title = xmlElement.GetElementValue("Title"); //This is where the error occurs
    //lots more code below
}

以下是XElement对象的扩展方法:

public static class XElementExtension
{
    public static string GetElementValue(this System.Xml.Linq.XElement xelement, string xname)
    {
        if (xelement != null) {
            System.Xml.Linq.XElement temp = xelement.Descendants(xname).FirstOrDefault();
            if(temp != null)
                return temp.Value;
        }
        return "";
    }
}

现在我收到以下.NET内部服务器错误500,建议在运行时它没有意识到我有对象的扩展方法。

'System.Xml.Linq.XElement' does not contain a definition for 'GetElementValue'

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

将此类文件编译成导致此问题的DLL时是否存在排序问题,或者是否有办法确保可以找到扩展方法?我已经在一个非动态函数上测试了扩展方法,该函数明确地接受了System.Xml.Linq.XElement并且运行正常,但是因为我有两个通过这个方法传递的对象,所以我宁愿更喜欢使用1个动态方法用2种显式方法复制代码。

1 个答案:

答案 0 :(得分:1)

扩展方法在编译时绑定 - 编译器将方法调用转换为对实际静态方法的调用。 dynamic将所有绑定推迟到运行时,其中没有机制来搜索适当的扩展方法。

您可以模拟该绑定并直接调用静态方法:

private void SetContentDynamic(dynamic xmlElement)
{
    //Defaults
    this.Title = XElementExtension.GetElementValue(xmlElement,"Title"); 
    //lots more code below
}

但如果xmlElement不是XElement,那么在运行时会失败。我只是将参数声明为XElement,除非您有理由将其设为dynamic