c# – 如何在CRM Dynamics中使用别名属性时从fetchedXML访问值?

前端之家收集整理的这篇文章主要介绍了c# – 如何在CRM Dynamics中使用别名属性时从fetchedXML访问值?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在提取营销列表清单.正如我这样做,根据我使用intellisense的检查,这似乎是一次成功的操作.当我寻找…实体[0] .Attributes [“nick”]我得到一个对象(在其中的某个地方有正确的数据).但是我不能以编程方式访问它(相反,我必须像猴子一样点击,通过优点来折叠好东西).

事实上,我得到的实体应该使用下面的代码.问题是根据计算机它们不是字符串.它们是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似乎也在使用该语法……

解决方法

查看 documention,Entity对象的Attributes属性属于AttributeCollection类型,它派生自DataCollection< string,Object>.

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
};

猜你在找的C#相关文章