我正在编写一个插件,我检查字段的特定值,选项集是否等于特定值,如果是,那么我会做某些操作。
现在,在插件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
}
}
}
答案 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)