HiveBrain v1.2.0
Get Started
← Back to all entries
patterncsharpMinor

Usage of Expression<Func<T>>

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
expressionusagefunc

Problem

I am developing data-interfacing that converts between two different data models.
However, I must be sure that all required fields exist. Therefore I have written this utility class that I can easily use to verify required fields.

However I am unsure whether this is the best way because of the expression that needs to be compiled and the usage of reflection. Any feedback is welcome!

Usage

public OutputDataElement DetermineRetailTransactionShopperType(IHeaderEntity headerEntity)
    {
        Ensure.IsNotNull(() => headerEntity);
        Ensure.IsNotNull(() => headerEntity.ShopId, "headerEntity");

        // Some mapping logic removed from the example
    }


Utility

/// 
/// Helper class able to ensure expectations
/// 
public static class Ensure
{
    public static void IsNotNull(Expression> property) where T : class
    {
        IsNotNullImpl(property, null);
    }

    public static void IsNotNull(Expression> property, string paramName) where T : class
    {
        IsNotNullImpl(property, paramName);
    }

    private static void IsNotNullImpl(Expression> property, string paramName) where T : class
    {
        // Compile the linq expression
        Func compiledFunc = property.Compile();

        // Invoke the linq expression to get the value
        T fieldValue = compiledFunc.Invoke();

        // Check whether we have a value
        if ((fieldValue is string && fieldValue.ToString() == string.Empty) || (fieldValue == null))
        {
            // We have no value. Get the initial expression
            var expression = (MemberExpression)property.Body;

            // log information about the expression that failed
            throw new ArgumentException(string.Format("Missing required field '{0}'", expression.Member.Name), string.IsNullOrEmpty(paramName) ? null : paramName);
        }
    }
}

Solution

I don't see any unnecessary reflection in your code.

One think that could be simplified is your check for string.Empty:

if (fieldValue == null || fieldValue as string == string.Empty)

Code Snippets

if (fieldValue == null || fieldValue as string == string.Empty)

Context

StackExchange Code Review Q#12882, answer score: 5

Revisions (0)

No revisions yet.