Dynamics crm 2011 如何为实体特定(即本地)选项集文本值自动生成早期绑定属性?

Dynamics crm 2011 如何为实体特定(即本地)选项集文本值自动生成早期绑定属性?,dynamics-crm-2011,dynamics-crm,Dynamics Crm 2011,Dynamics Crm,在花了一年时间使用Microsoft.Xrm.Sdk命名空间之后,我昨天才发现Entity.FormattedValues属性包含实体特定(即本地)选项集文本的文本值 我以前没有发现它的原因是,没有获得值的早期绑定方法。i、 e.实体。新的类型为OptionSetValue,它只包含int值。您必须调用entity.FormattedValues[“new\u myoptionstart”]来获取选项setvalue的字符串文本值 因此,我想让crmsrvcutil为本地选项集自动生成一个文本属

在花了一年时间使用
Microsoft.Xrm.Sdk
命名空间之后,我昨天才发现
Entity.FormattedValues
属性包含实体特定(即本地)选项集文本的文本值

我以前没有发现它的原因是,没有获得值的早期绑定方法。i、 e.
实体。新的
类型为
OptionSetValue
,它只包含
int
值。您必须调用entity.FormattedValues[“new\u myoptionstart”]来获取
选项setvalue
字符串
文本值

因此,我想让crmsrvcutil为本地选项集自动生成一个文本属性。i、 e.与当前生成的
Entity.new\u myOptionSetText
一起,还将生成
Entity.new\u myOptionSetText

我已经研究了,但这看起来主要是为了指定什么
codenerationtype
应该是什么

是否有一种方法支持使用CrmServiceUtil添加这些属性,或者我最好编写一个可以运行的自定义应用程序,将这些属性作为自动生成属性的部分类生成

编辑-我希望生成的代码示例 目前,每当我需要访问OptionSetValue的文本值时,我都会使用以下代码:

var textValue = OptionSetCache.GetText(service, entity, e => e.New_MyOptionSet);
选项集缓存将使用
实体.LogicalName
和属性表达式来确定我请求的选项集的名称。然后,它将使用
RetrieveAttriubteRequest
查询SDK,以获取选项集int和text值的列表,然后将其缓存,这样就不必再次访问CRM。然后,它查找实体的
New\u MyOptionSet
的int值,并将其与缓存列表交叉引用,以获取OptionSet的文本值

我可以这样做,而不必做所有这些(假设已从服务器检索实体,而不只是填充客户端):

但“新发病”不再是早期的。我希望生成的早期绑定实体类也能为调用上述行的OptionSetValue属性生成一个额外的“Text”属性,这样我的实体就可以添加这个属性:

public string New_MyOptionSetText {
    return this.GetFormattedAttributeValue("new_myoptionset"); // this is a protected method on the Entity class itself...
}

您是否可以利用CrmServiceUtil扩展为您的选项集生成枚举,然后将新的\u myOptionSetText属性添加到一个分部类中,该分部类将int值与枚举进行比较,我认为在这种情况下,获取
CrmSvcUtil.exe
以生成所需的代码是一个好主意,但更一般地说,您可以使用类似于公认答案的方法通过反射访问属性名@

var textValue=entity.FormattedValues[“新建”];
//变成
var textValue=entity.FormattedValues
[
//将类从Nameof重命名为Nameof
NameOf(Xrm.MyEntity).Property(x=>x.new\u MyOptionSet.ToLower())
];
的最新版本包括一个包含字段名的
字段
结构。这使得访问FormattedValues的过程非常简单:

var textValue = entity.FormattedValues[MyEntity.Fields.new_MyOptionSet];

您可以通过CrmSvcUtil的接口创建一个新属性,但是对于一个相当简单的调用来说,这需要做大量的工作,我认为创建其他属性是不合理的。

您不能只调用枚举值上的
.ToString()
(例如
SalesOrderState.Invoinced.ToString()
),或者您在谈论其他内容?@PeterMajeed在选项集上调用ToString生成的enum并不总是有效(如果文本值为“Ready to Ship”,则enum.ToString()将为“ReadytoShip”。另一个不起作用的选项是“A+”)。我目前已经为CrmServiceUtil的接口编写了代码,确保所有optionset文本值都是有效的C#enum名称,因此我知道该方法不起作用。鉴于CrmSvcUtil缺乏文档,我认为这是一个很好的问题。尽管如此,我不明白当您可以通过格式化值访问字符串值时,为什么需要选项集的字符串值的早期绑定版本。你认为你可以分享几行代码/伪代码来证明你的最终目的吗?我应该更仔细地阅读你的评论…看起来你已经考虑过了。实际上,对于格式化的值,我不需要将int值与任何东西进行比较。它实际上包含选项集值的文本值。问题是,有没有一种方法可以使用crmsrvcutil接口覆盖属性创建,它允许我为选项集值文本添加额外的早期绑定属性…好问题!如果你能做到这一点,那将是一个很好的扩展点。我想我必须编写一个控制台应用程序,它根据生成的代码运行,确定每个选项集是全局的还是本地的,然后用本地选项集值文本属性生成分部类。使用反射或正则表达式(文本)应该不会太难吧?MetaDataService会有这些信息吗?由于MSFT货币问题,我被重新引入属性表…SQL可能是一个快速/肮脏的计划B属性的代码应该自动生成,这意味着使用“硬编码”字符串是完全可以接受的。此外,并非每个选项集值属性都有相应的文本属性,因为并非每个选项集都是本地属性。因此,即使这是一种“早期绑定”的获取属性的方法,也无助于帮助开发人员了解哪些属性对他们真正可用。@Daryl:不确定全局选项集和局部选项集之间的区别是否重要,因为最终所有全局选项集都存储在本地,并且可以使用<代码
var textValue = entity.FormattedValues[MyEntity.Fields.new_MyOptionSet];