2

私は、フィールドの特定の値、オプションセットが特定の値と等しいかどうかをチェックするプラグインを作成しています。等しい場合は、特定のアクションを実行します。

プラグインのC#コード内で、[オプションセット]フィールドがnullでないこと、つまりデフォルト値に設定されていることを確認するにはどうすればよいですか?

私がしたこと(明らかに、それは間違っています)。なぜなら、それは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が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);
    }
}

それぞれオーバーロードのある2つのメソッドがあります。

  • GetValueOrDefault-これはNullable.GetValueOrDefault()と同等です。1つの違いは、デフォルトで0に設定されるのではなく、デフォルトでint.MinValue0のオプションセット値に誤って一致しないようにすることです。オーバーロードを使用すると、必要に応じてデフォルト値を指定できます。

  • 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 に答える