Plugins CRM 2011插件-检查OptionSet是否为空

Plugins CRM 2011插件-检查OptionSet是否为空,plugins,null,dynamics-crm-2011,Plugins,Null,Dynamics Crm 2011,我正在写一个插件,在这里我检查一个字段的一个特定值,一个选项集是否等于一个特定值,如果是这样,那么我会做一些特定的操作 现在,在插件C#代码中,我如何检查选项集字段是否不为空,即是否设置为默认值 我所做的(很明显,这是错误的)是因为,它从未通过空检查语句。如果我没有支票,那么我会收到这个错误消息 错误: Unexpected exception from plug-in (Execute): CRM.AppStateHandler.Plugins.PostApplicationCreate: S

我正在写一个插件,在这里我检查一个字段的一个特定值,一个选项集是否等于一个特定值,如果是这样,那么我会做一些特定的操作

现在,在插件C#代码中,我如何检查选项集字段是否不为空,即是否设置为默认值

我所做的(很明显,这是错误的)是因为,它从未通过空检查语句。如果我没有支票,那么我会收到这个错误消息

错误

Unexpected exception from plug-in (Execute): CRM.AppStateHandler.Plugins.PostApplicationCreate: System.NullReferenceException: Object reference not set to an instance of an object.
代码

Unexpected exception from plug-in (Execute): CRM.AppStateHandler.Plugins.PostApplicationCreate: System.NullReferenceException: Object reference not set to an instance of an object.
application applicationEntity=entity.ToEntity();
if(new_applicationEntity.new_Applicationstatus!=null)
{
var applicationStatus=applicationEntity.new_applicationStatus.Value;
if(applicationStatus==CRMConstants.EntityApplication.Attributes.ApplicationStatusOptions.Applying)
{
//我的逻辑
}
}
文件constants.cs具有以下内容

类CRMConstants
{
公共结构实体应用程序
{
公共结构属性
{
公共结构应用程序状态选项
{
//在此之前还有更多
应用的公共常数=10000006;
//还有更多
}
}
}
您正在检查:

if (new_applicationEntity.new_Applicationstatus != null)
但您需要检查:

if (applicationEntity.new_Applicationstatus != null)

我认为SergeyS有你的解决办法,但我会补充一些其他(希望)有用的评论

不要为选项集值自定义创建结构。请使用自动创建枚举

我对必须检查OptionSetValues是否为null感到恼火,因此我使用这些扩展方法来简化我的生活:

//
///返回OptionSetValue的值,如果为null,则返回int.MinValue
/// 
/// 
/// 
/// 
公共静态int GetValueOrDefault(此选项SetValue osv)
{
返回GetValuerDefault(osv,int.MinValue);
}
/// 
///返回OptionSetValue的值,如果为null,则返回int.MinValue
/// 
/// 
/// 
/// 
公共静态int GetValue或Default(此选项SetValue osv,int defaultValue)
{
如果(osv==null)
{
返回默认值;
}
其他的
{
返回osv.Value;
}
}
/// 
///允许空安全等于比较,以获得更简洁的代码。
///if(contact.GenderCode.NullSafeEquals(1))
///vs。
///if(contact.GenderCode!=null&&contact.GenderCode.Value==1)
/// 
/// 
/// 
/// 
公共静态bool NullSafeEquals(此选项设置值osv,int值)
{
如果(osv==null)
{
返回false;
}
其他的
{
返回osv.Value==Value;
}
}
/// 
///允许空安全等于比较,以获得更简洁的代码。
///if(contact.GenderCode.NullSafeEquals(新选项开始(1)))
///vs。
///if(contact.GenderCode!=null&&contact.GenderCode.Value==newoptionstart(1))
/// 
/// 
/// 
/// 
公共静态布尔值NullSafeEquals(此选项设置值osv,选项设置值值)
{
如果(osv==null)
{
返回osv==值;
}
其他的
{
返回osv.Equals(值);
}
}
有两种方法各有一个重载:

  • GetValuerDefault-这相当于可为null的.GetValuerDefault()。唯一的区别不是默认值为0,而是默认值为
    int.MinValue
    ,以确保不会意外匹配0 optionset值。如果愿意,重载允许您指定默认值

  • NullSafeEquals-这是您在代码中使用的一个,不必检查null

application applicationEntity=entity.ToEntity();
if(applicationEntity.new_Applicationstatus.NullSafeEquals(CRMConstants.EntityApplication.Attributes.ApplicationStatusOptions.application))
{
//我的逻辑
}

您能概述一下使用CRMCrvcUtil生成枚举的过程吗?这是否包括自定义字段的选项集值?@DeveloperM检查:相反,我还在为XrmToolBox创建一个插件,以实现更多功能……希望我能在一两周内完成。感谢您的链接。我几个月前看到了这一点,随后又看到了它但生成的文件没有如预期的那样包含枚举。我将重试,可能是输入错误或汇总错误…@DeveloperM,不知道您是否仍在处理此问题,但我已成功发布了我的早期绑定实体生成器: