CodePaste Logo
New Snippet New Snippet Recent Snippets Recent Snippets My Snippets My Snippets Web Code Search Snippets Search
Sign inor Register
Language: C#

Name, Member and Method classes

172 Views
Copy Code Show/Hide Line Numbers
 
/// <summary>
/// Represents static and extension methods to retrieve the name
/// of a member or argument from lamba expressions.
/// </summary>
public static class Name
{
    /// <summary>
    /// Gets the name of a member or argument from a lamba expression.
    /// </summary>
    /// <param name="expression">The expression.</param>
    /// <returns>The name of the item found in the expression - or - null if the expression is too complicated.</returns>
    public static string Of(Expression<Action> expression)
    {
        return expression.GetName();
    }
 
    /// <summary>
    /// Gets the name of a member or argument from a lamba expression.
    /// </summary>
    /// <param name="expression">The expression.</param>
    /// <returns>The name of the item found in the expression - or - null if the expression is too complicated.</returns>
    public static string Of(Expression<Func<object>> expression)
    {
        return expression.GetName();
    }
 
    /// <summary>
    /// Gets the name of a member or argument from a lamba expression.
    /// </summary>
    /// <param name="expression">The expression.</param>
    /// <typeparam name="T">Not used.</typeparam>
    /// <returns>The name of the item found in the expression - or - null if the expression is too complicated.</returns>
    public static string Of<T>(Expression<Func<T, object>> expression)
    {
        return expression.GetName();
    }
 
    /// <summary>
    /// Gets the name of a member or argument from a lamba expression.
    /// </summary>
    /// <param name="expression">The expression.</param>
    /// <returns>The name of the item found in the expression - or - null if the expression is too complicated.</returns>
    public static string GetName(this LambdaExpression expression)
    {
        if (expression == null)
            return null;
 
        return Search(expression.Body);
    }
 
    private static string Search(Expression expression)
    {
        // Tail call.
        while (expression != null)
        {
 
            var parameterExpression = expression as ParameterExpression;
            if (parameterExpression != null)
            {
                return parameterExpression.Name;
            }
 
            var memberExpression = expression as MemberExpression;
            if (memberExpression != null)
            {
                return memberExpression.Member.Name;
            }
 
            var methodCallExpression = expression as MethodCallExpression;
            if (methodCallExpression != null)
            {
                return methodCallExpression.Method.Name;
            }
 
            var unaryExpression = expression as UnaryExpression;
            if (unaryExpression != null)
            {
                expression = unaryExpression.Operand;
            }
 
        }
        return null;
    }
}
 
/// <summary>
/// Represents static and extension methods to retrieve
/// a method from lamba expressions.
/// </summary>
public static class Method
{
    /// <summary>
    /// Gets the method from a lamba expression.
    /// </summary>
    /// <param name="expression">The expression.</param>
    /// <returns>The item found in the expression - or - null if the expression is too complicated.</returns>
    public static MethodInfo Of(Expression<Action> expression)
    {
        return expression.AsMethodInfo();
    }
 
    /// <summary>
    /// Gets the method from a lamba expression.
    /// </summary>
    /// <param name="expression">The expression.</param>
    /// <returns>The item found in the expression - or - null if the expression is too complicated.</returns>
    public static MethodInfo Of(Expression<Func<object>> expression)
    {
        return expression.AsMethodInfo();
    }
 
    /// <summary>
    /// Gets the method from a lamba expression.
    /// </summary>
    /// <param name="expression">The expression.</param>
    /// <typeparam name="T">Not used.</typeparam>
    /// <returns>The item found in the expression - or - null if the expression is too complicated.</returns>
    public static MethodInfo Of<T>(Expression<Func<T, object>> expression)
    {
        return expression.AsMethodInfo();
    }
 
    /// <summary>
    /// Gets the method from a lamba expression.
    /// </summary>
    /// <param name="expression">The expression.</param>
    /// <returns>The item found in the expression - or - null if the expression is too complicated.</returns>
    public static MethodInfo AsMethodInfo(this LambdaExpression expression)
    {
        return expression.AsMemberInfo() as MethodInfo;
    }
}
 
/// <summary>
/// Represents static and extension methods to retrieve
/// a member from lamba expressions.
/// </summary>
public static class Member
{
    /// <summary>
    /// Gets the member from a lamba expression.
    /// </summary>
    /// <param name="expression">The expression.</param>
    /// <returns>The item found in the expression - or - null if the expression is too complicated.</returns>
    public static MemberInfo Of(Expression<Action> expression)
    {
        return expression.AsMemberInfo();
    }
 
    /// <summary>
    /// Gets the member from a lamba expression.
    /// </summary>
    /// <param name="expression">The expression.</param>
    /// <returns>The item found in the expression - or - null if the expression is too complicated.</returns>
    public static MemberInfo Of(Expression<Func<object>> expression)
    {
        return expression.AsMemberInfo();
    }
 
    /// <summary>
    /// Gets the member from a lamba expression.
    /// </summary>
    /// <param name="expression">The expression.</param>
    /// <typeparam name="T">Not used.</typeparam>
    /// <returns>The item found in the expression - or - null if the expression is too complicated.</returns>
    public static MemberInfo Of<T>(Expression<Func<T, object>> expression)
    {
        return expression.AsMemberInfo();
    }
 
    /// <summary>
    /// Gets the member from a lamba expression.
    /// </summary>
    /// <param name="expression">The expression.</param>
    /// <returns>The item found in the expression - or - null if the expression is too complicated.</returns>
    public static MemberInfo AsMemberInfo(this LambdaExpression expression)
    {
        return Search(expression.Body);
    }
 
    private static MemberInfo Search(Expression expression)
    {
        // Tail call.
        while (expression != null)
        {
 
            var methodCallExpression = expression as MethodCallExpression;
            if (methodCallExpression != null)
            {
                return methodCallExpression.Method;
            }
 
            var memberExpression = expression as MemberExpression;
            if (memberExpression != null)
            {
                return memberExpression.Member;
            }
 
            var unaryExpression = expression as UnaryExpression;
            if (unaryExpression != null)
            {
                expression = unaryExpression.Operand;
            }
 
        }
        return null;
    }
}
by Jonathan Chayce Dickinson
  April 13, 2010 @ 3:05am
Tags:
Description:
Implementation in reply to http://codepaste.net/tfwmsu

Add a comment


Report Abuse
brought to you by:
West Wind Techologies



If you find this site useful and use it frequently please consider making a donation to support this free service.
Donate