view MetroWpf/MetroWpf.Framework/Extensions/PropertyExtensions.cs @ 114:e51a6af1c98d

working version
author adminsh@apollo
date Sat, 19 May 2012 16:53:34 +0100
parents 060f02cd4591
children
line wrap: on
line source

using System;
using System.ComponentModel;
using System.Linq.Expressions;

namespace Chronos.Presentation.ViewModel
{
    /// <summary>
    /// Property Extension Methods
    /// </summary>
    /// <remarks>
    /// http://reyntjes.blogspot.com/2009/04/master-detail-viewmodel_24.html
    /// http://blogs.ugidotnet.org/bmatte/archive/2008/11/28/pattern-model-view-viewmodel-inotifypropertychanged-static-reflection-e-extension-methods.aspx
    /// </remarks>
    public static class PropertyExtensions
    {
        #region · Extension Methods ·

        /// <summary>
        /// Creates a <see cref="PropertyChangedEventArgs" /> instance for a given property.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="property">The property.</param>
        /// <returns></returns>
        public static PropertyChangedEventArgs CreateChangeEventArgs<T>(this Expression<Func<T>> property)
        {
            var expression  = property.Body as MemberExpression;
            var member      = expression.Member;

            return new PropertyChangedEventArgs(member.Name);
        }

        /// <summary>
        /// Returns property name from expression
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="property"></param>
        /// <returns></returns>
        public static string GetPropertyName<T>(this Expression<Func<T>> property)
        {
            var expression = property.Body as MemberExpression;
            
            return expression.Member.Name;
        }

        /// <summary>
        /// Return property name from expression.
        /// </summary>
        /// <example>
        /// <![CDATA[
        ///     Expression<Func<Item, object>> expression = i => i.Name;
        ///     var propertyName = expression.GetPropertyName(); // propertyName = "Name"
        /// ]]>
        /// </example>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="TValue"></typeparam>
        /// <param name="expression"></param>
        /// <returns></returns>
        public static string GetPropertyName<T, TValue>(this Expression<Func<T, TValue>> expression)
        {
            var lambda = expression as LambdaExpression;

            MemberExpression memberExpression;

            if (lambda.Body is UnaryExpression)
            {
                var unaryExpression = lambda.Body as UnaryExpression;
                memberExpression = unaryExpression.Operand as MemberExpression;
            }
            else
            {
                memberExpression = lambda.Body as MemberExpression;
            }

            if (memberExpression != null)
            {
                return memberExpression.Member.Name;
            }

            return null;
        }

        #endregion
    }
}