我正在获取营销列表列表。当我这样做时,根据我使用智能感知的检查,这似乎是一次成功的操作。当我寻找 ...Entities[0].Attributes["nick"]
时,我得到一个对象(其中某处有正确的数据)。但我无法以编程方式访问它(相反,我必须像猴子一样通过加号四处点击以折叠出好东西)。
事实上,我正在使用下面的代码获取预期的实体。问题是根据计算机,它们不是 Strings
。它们属于 Microsoft.Xrm.Sdk.AliasedValue
类型,我不知道如何访问其中的实际昵称。
new Contact
{
Name = element.Attributes["nick"] as String,
Mail = element.Attributes["mail"] as String
}
Intellisense 说 Value
在那里(而且它也是正确的值)但我无法通过键入 .Value
来访问它。我怀疑我需要使用“as”或类似的东西,但此刻我被卡住了。有什么提示吗? As
'ing 到 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似乎也在使用该语法...
最佳答案
查看 documention , Attributes
Entity
的属性(property)对象的类型是 AttributeCollection
,源自 DataCollection<string,Object>
.
For each attribute in the collection there is a key/value pair.
因此对于每个键(“nick”、“mail”),都有一个对应的 object
,它可以是任何 .NET 类型。您必须将对象转换为正确的类型(正如您所做的那样)以访问您正在寻找的属性(或者使用反射,这肯定会更丑陋,或者我想在 C# 中4.0 dynamic
type ,但在那种情况下,你会失去编译时检查);编译器还能如何确定属性是否属于 string
类型?/Money
/int
/AliasedValue
/等等?
至于 AliasedValue
,CRM 使用此类型存储有关返回值的附加信息,并且由于任何属性都可以使用别名,因此 Value
属性可以是任何类型( OptionSetValue
、 decimal
、 string
、 Guid
、 EntityReference
等)。 Value
然后属性也适本地属于 object
类型,因此您也必须对其进行转换以获取有关返回值的任何其他信息。
所以没有办法绕过强制转换,但您可以通过添加 using
使您的代码更短甚至更清晰。在文件顶部声明并定义每个 AliasedValue
的值在分配给 Contact
之前.不管怎样,我已经包含了每种数据检索的一个例子;你可以判断哪个在你的项目中更好。
使用转换:
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
};
关于c# - 在 CRM Dynamics 中使用属性的别名时如何从 fetchedXML 访问值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12643418/