2

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

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

我所做的(显然,这是错误的)因为它从未超过 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
            }
        }
    }
4

2 回答 2

3

我认为 SergeyS 可以解决您的问题,但我会添加一些其他(希望如此)有用的评论。

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

我对必须检查 OptionSetValues 是否为空感到恼火,所以我使用这些扩展方法让我的生活更轻松:

/// <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 - 这是您在代码中使用的不必检查 null

application applicationEntity = entity.ToEntity<new_application>();
if (applicationEntity.new_Applicationstatus.NullSafeEquals(CRMConstants.EntityApplication.Attributes.ApplicationStatusOptions.Applying))
{
    //my logic
}
于 2013-03-22T13:28:27.707 回答
2

您正在检查:

if (new_applicationEntity.new_Applicationstatus != null)

但你需要检查:

if (applicationEntity.new_Applicationstatus != null)
于 2013-03-22T13:17:29.187 回答