Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 名称已绑定到方法,不能像属性一样使用_C#_Xml_Wcf_Service_Foreach - Fatal编程技术网

C# 名称已绑定到方法,不能像属性一样使用

C# 名称已绑定到方法,不能像属性一样使用,c#,xml,wcf,service,foreach,C#,Xml,Wcf,Service,Foreach,我正在为我的工作开发一个WCF服务应用程序,其中我获取一个XML并将其转换为PRX。我遇到了一个大问题。这是我的密码: publicstringconvertXMLtoprx(stringtheXML)//将传入的xml文件转换为prx格式的方法 { dynamic aXml=XDocument.Parse(theXml);//解析传递到方法中的XML var mProposalMstr=aXml.Root.Element(“ProposalMstr”); if(mProposalMstr==n

我正在为我的工作开发一个WCF服务应用程序,其中我获取一个XML并将其转换为PRX。我遇到了一个大问题。这是我的密码:

publicstringconvertXMLtoprx(stringtheXML)//将传入的xml文件转换为prx格式的方法
{
dynamic aXml=XDocument.Parse(theXml);//解析传递到方法中的XML
var mProposalMstr=aXml.Root.Element(“ProposalMstr”);
if(mProposalMstr==null)//检查传入XML中是否存在根元素
抛出新异常(“无法转换为PRX-未找到元素ProposalMstr”);//如果根元素不存在,则抛出异常
System.Text.StringBuilder tempPrxString=new System.Text.StringBuilder();//从xml文件接收传入文本的新StringBuilder对象
tempPrxString.Append(“StartApp”);//PRX文件的第一部分
Append(System.Environment.NewLine);
foreach(aXml.Elements中的XElement thisElem)//循环遍历XML文件中的每个元素
tempPrxString.AppendLine(“Field |“+thisElem.Name+“|”+thisElem.Value);//基于XML文件中每个节点的PRX字符串构建
tempRxString.AppendLine(“EndRecord |”);//PRX字符串的结尾
return tempRxString.ToString();//返回prx字符串
}
当它到达foreach循环时,它会遇到一个运行时错误,说“名称‘Elements’绑定到一个方法,不能像属性一样使用。”


我到处找,找不到解决办法。有人有什么建议吗?提前感谢您的帮助。

这是因为
aXml
是一种安全的工具。如果您查看文档,您将看到
XDocument.Elements
是从继承而来的,它是一个不接受任何参数的方法要调用不接受任何参数的方法,仍然必须指定空参数列表(括号):

动态
您可能想知道为什么这会在运行时而不是在编译时抛出错误。通知C#编译器它无法对修改后的表达式或变量执行类型检查。相反,类型检查和解析将在运行时执行。当您无法提前知道类型,但仍希望使用“普通”语法与之交互时,这非常有用

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

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
的另一个用途是提供对or的更漂亮的访问。例如:

避免
dyanmic
然而,在您的例子中,您和C编译器可以很容易地猜测的类型是什么。你有两个更好的选择。或者通过编写
XDocument aXml=XDocument.Parse(xml),告诉C#编译器您希望
XDocument.Parse(string)
返回
XDocument
或让C#编译器通过编写
var aXml=XDocument.Parse(theXml)为您进行推理。如果使用,编译器将自动将
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'?
耶!编译器已捕获您的错误,您已从混乱的运行时崩溃中逃脱!现在,您可以添加缺少的
()
,然后再次尝试编译

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

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);
}
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'?