C# 名称已绑定到方法,不能像属性一样使用
我正在为我的工作开发一个WCF服务应用程序,其中我获取一个XML并将其转换为PRX。我遇到了一个大问题。这是我的密码: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
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'?