事实上,我得到的实体应该使用下面的代码.问题是根据计算机它们不是字符串.它们是Microsoft.Xrm.Sdk.AliasedValue类型,我不知道如何访问它们内部的实际缺口.
new Contact { Name = element.Attributes["nick"] as String,Mail = element.Attributes["mail"] as String }
Intellisense说Value在那里(并且它也是正确的值)但我无法通过输入.Value来访问它.我怀疑我需要使用“as”或类似的东西,但此刻我被卡住了.任何提示?作为String,它应该工作,给我null …
我已经阅读了this article和其他几个喜欢它和我看到它的方式,我应该能够访问那里所有有趣的东西.我不能……
我注意到以下代码为我提供了我非常想要获取的数据,但这不是一个专业的语法,可以吗?!说真的,它看起来像一个患有多动症和宿醉的高中生试图这样做……
new Contact { Name = ((Microsoft.Xrm.Sdk.AliasedValue)result.Entities[0].Attributes["nick"]).Value,Mail = ((Microsoft.Xrm.Sdk.AliasedValue)result.Entities[0].Attributes["mail"]).Value }
我的意思是,认真 – 这是一段丑陋的代码……必须有一个更好的方法!但是,我担心没有,因为this discussion似乎也在使用该语法……
解决方法
For each attribute in the collection there is a key/value pair.
因此,对于每个密钥(“nick”,“mail”),都有一个对应的对象,可以是任何.NET类型.你必须将对象强制转换为正确的类型(正如你所做的那样)来访问你正在寻找的属性(或者使用反射,这肯定会更加丑陋,或者我认为在C#4.0中是dynamic
type,但在那里如果你丢失了编译时检查);如何编译器能够确定属性是否为string / Money / int / AliasedValue / etc类型?
对于AliasedValue
,CRM使用此类型存储有关返回值的其他信息,并且由于任何属性都可以别名,因此Value属性可以是任何类型(OptionSetValue,decimal,string,Guid,EntityReference等). Value属性也适用于object类型,因此您必须转换它以获取有关返回值的任何其他信息.
因此无法进行强制转换,但您可以通过在文件顶部添加using语句并在分配给Contact之前定义每个AliasedValue的值来缩短代码并使代码更简洁.无论如何,我已经包含了每种数据检索的一个例子;你可以判断你的项目哪个更好.
使用铸造:
using Microsoft.Xrm.Sdk; ... var nick = (AliasedValue)result.Entities[0].Attributes["nick"]; var mail = (AliasedValue)result.Entities[0].Attributes["mail"]; var contact = new Contact { Name = nick.Value,//Value is of type object; cast again for a more specific type Mail = mail.Value };
使用反射:
var nick = result.Entities[0].Attributes["nick"] .GetType() .GetProperty("Value") .GetValue(result.Entities[0].Attributes["nick"],null); var mail = result.Entities[0].Attributes["mail"] .GetType() .GetProperty("Value") .GetValue(result.Entities[0].Attributes["mail"],null); var contact = new Contact { Name = nick,Mail = mail };
使用动态:
dynamic nick = result.Entities[0].Attributes["nick"]; dynamic mail = result.Entities[0].Attributes["mail"]; var contact = new Contact { Name = nick.Value,//dynamic figures out the right property at runtime Mail = mail.Value };