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

时间:2013-03-22 13:07:21

标签: plugins null dynamics-crm-2011

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

现在,在插件C#代码中,如何检查Option Set字段是否为空 - 即设置为默认值?

我做了什么(显然,这是错误的),因为它从未超过Null检查声明。而且,如果我没有检查,那么我收到此错误消息

错误

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<new_application>();
if (new_applicationEntity.new_Applicationstatus != null)
{
    var applicationStatus = applicationEntity.new_Applicationstatus.Value;
    if (applicationStatus == CRMConstants.EntityApplication.Attributes.ApplicationStatusOptions.Applying)
    {
        //my logic
    }
}

文件constants.cs具有以下内容

class CRMConstants
{
    public struct EntityApplication
    {
        public struct Attributes
        {
            public struct ApplicationStatusOptions
            {
                // More before this
                public const int Applying = 100000006;
                // More to come
            }
        }
    }

2 个答案:

答案 0 :(得分:3)

我认为SergeyS有你的修复,但我会添加一些其他(希望)有用的评论。

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

我不得不检查OptionSetValues是否为null,所以我使用这些扩展方法让我的生活更轻松:

/// <summary>
/// Returns the value of the OptionSetValue, or int.MinValue if it is null
/// </summary>
/// <param name="osv"></param>
/// <param name="value"></param>
/// <returns></returns>
public static int GetValueOrDefault(this OptionSetValue osv)
{
    return GetValueOrDefault(osv, int.MinValue);
}

/// <summary>
/// Returns the value of the OptionSetValue, or int.MinValue if it is null
/// </summary>
/// <param name="osv"></param>
/// <param name="value"></param>
/// <returns></returns>
public static int GetValueOrDefault(this OptionSetValue osv, int defaultValue)
{
    if (osv == null)
    {
        return defaultValue;
    }
    else
    {
        return osv.Value;
    }
}

/// <summary>
/// Allows for Null safe Equals Comparison for more concise code.  ie.
/// if(contact.GenderCode.NullSafeEquals(1))
/// vs.
/// if(contact.GenderCode != null && contact.gendercode.Value == 1)
/// </summary>
/// <param name="osv"></param>
/// <param name="value"></param>
/// <returns></returns>
public static bool NullSafeEquals(this OptionSetValue osv, int value)
{
    if (osv == null)
    {
        return false;
    }
    else
    {
        return osv.Value == value;
    }
}

/// <summary>
/// Allows for Null safe Equals Comparison for more concise code.  ie.
/// if(contact.GenderCode.NullSafeEquals(new OptionSet(1)))
/// vs.
/// if(contact.GenderCode != null && contact.gendercode.Value == new OptionSet(1))
/// </summary>
/// <param name="osv"></param>
/// <param name="value"></param>
/// <returns></returns>
public static bool NullSafeEquals(this OptionSetValue osv, OptionSetValue value)
{
    if (osv == null)
    {
        return osv == value;
    }
    else
    {
        return osv.Equals(value);
    }
}

有两种方法都有重载:

  • GetValueOrDefault - 这相当于Nullable.GetValueOrDefault()。一个区别是不是默认为0,我默认为int.MinValue以确保我不会在0选项集值上意外匹配。如果您愿意,Overload允许您指定默认值。

  • NullSafeEquals - 这是您在代码中使用的不必检查空的

application applicationEntity = entity.ToEntity<new_application>();
if (applicationEntity.new_Applicationstatus.NullSafeEquals(CRMConstants.EntityApplication.Attributes.ApplicationStatusOptions.Applying))
{
    //my logic
}

答案 1 :(得分:2)

您正在检查:

if (new_applicationEntity.new_Applicationstatus != null)

但你需要检查:

if (applicationEntity.new_Applicationstatus != null)