Name绑定到方法,不能像属性一样使用

本文关键字:一样 属性 绑定 方法 不能 Name | 更新日期: 2023-09-27 18:01:58

我正在为我的工作开发一个WCF服务应用程序,我将XML转换为PRX。我遇到了一个大障碍。下面是我的代码:

public string ConvertXMLtoPRX(string theXml) //method to convert the incoming xml file to prx format
{
    dynamic aXml = XDocument.Parse(theXml);             //parse the XML that has been passed into the method
    var mProposalMstr = aXml.Root.Element("ProposalMstr");
    if (mProposalMstr == null)                                       //check to see if the root element in the incoming XML is present
        throw new Exception("Cannot be converted to PRX - element ProposalMstr not found.");  //exception to be thrown if the root element is not present 
    System.Text.StringBuilder tempPrxString = new System.Text.StringBuilder();               //new StringBuilder object to take in incoming text from the xml file
    tempPrxString.Append("StartApp");                                //First part of the PRX file
    tempPrxString.Append(System.Environment.NewLine);
    foreach (XElement thisElem in aXml.Elements)                                 //loop through each element in the XML file
        tempPrxString.AppendLine("Field|" + thisElem.Name + "|" + thisElem.Value);           //builds upon the PRX string for each node in the XML file
    tempPrxString.AppendLine("EndRecord|");                          //end of the PRX string
    return tempPrxString.ToString();                                //return the prx string 
}

当它到达foreach循环时,它遇到一个运行时错误,说"名称'Elements'绑定到一个方法,不能像属性一样使用。"

我一直在到处找,找不到解决这个问题的方法。有人有什么建议吗?谢谢你的帮助。

Name绑定到方法,不能像属性一样使用

这是因为aXmlXDocument。如果您查看文档,您将看到XDocument.Elements继承自XContainer.Elements,并且它是一个不接受参数的方法。要调用不接受参数的方法,您仍然必须指定一个空形参列表(括号):

foreach (XElement thisElem in aXml.Elements());

dynamic

您可能想知道为什么在运行时而不是在编译时抛出错误。dynamic关键字告诉c#编译器,它不能对修改后的表达式或变量执行类型检查。相反,类型检查和解析将在运行时执行。当您无法提前知道类型,但仍希望使用"正常"语法与之交互时,这很有用。

可能无法预测方法返回的类型。例如,它的签名表明返回object,但您知道该对象将具有具有特定名称的属性。如果您发现创建一个普通的旧数据类工作量太大,并且只想返回一个匿名类型,那么这种模式可能是有意义的:

static object doSomething()
{
    // Even though it’s a lie…
    return new { IsFoodTasty = true, FoodType = "Angelfood Cake", };
}
public static void Main()
{
    dynamic foodInfo = doSomething();
    Console.WriteLine(foodInfo.IsFoodTasty ? "Food {0} tastes good." : "Food {0} tastes bad.", foodInfo.FoodType);
}

dynamic的另一个用途是为ExpandoObjectDynamicObject提供更漂亮的访问。例如,

public static void Main()
{
    // I am building something like an ASP.NET MVC ViewBag…
    // Though, there are myriad reasons why you should prefer
    // typed views ;-).
    dynamic bag = new ExpandoObject();
    bag.Name = "Joe";
    bag.RandomThing = "Ridiculousness.";
    DoSomething(bag);
}
static void DoSomething(dynamic bag)
{
    Console.WriteLine("Hi, {0}.", bag.Name);
}

避免使用dynamic

然而,在您的情况下,您和c#编译器可以很容易地猜测XDocument.Parse(string)的类型-即XDocument。你有两个更好的选择。要么告诉c#编译器你希望XDocument.Parse(string)通过编写XDocument aXml = XDocument.Parse(theXml);来返回XDocument,要么让c#编译器通过编写var aXml = XDocument.Parse(theXml);来为你做推理。如果使用var,编译器会自动将aXml的编译时间类型设置为XDocument。无论您使用var还是XDocument,您现在都应该在编译时而不是运行时出现此错误:

1>c:'users'ohnob'documents'visual studio 2015'Projects'ConsoleApplication4'ConsoleApplication4'Program.cs(28,39,28,52): error CS0446: Foreach cannot operate on a 'method group'. Did you intend to invoke the 'method group'?

耶!编译器已经捕获了您的错误,您已经避免了令人困惑的运行时崩溃!现在您可以添加缺失的()并再次尝试编译…

一般来说,如果可以的话,应该避免使用dynamic关键字。c#有非常强大的工具来帮助您使用静态类型。例如,存在var,存在泛型支持,存在匿名类型支持,等等。将dynamic或类型转换放入代码中意味着c#编译器通常会执行的类型检查延迟到运行时。这使得更容易编写编译良好但在运行时不可预测地失败的代码。它甚至对性能也有影响,所以即使dynamic使特定的代码块更容易阅读,它也可能不适合在紧密循环中使用。