コード例 #1
0
        /// <summary>
        /// Gets property expression for some property in type. If property type is Enum or DateTime will be converted to string.
        /// It could looks like:
        /// c.SomeString, Convert.ToString(c.SomeDate, polishCulture), EnumHelper.GetDisplayName(typeof(SomeEnum), c.SomeEnum)
        /// </summary>
        /// <param name="propertyInfo">Reflection information about property in type.</param>
        /// <param name="sourceObjectParameter">Type parameter required for property expression.</param>
        /// <returns>Property expression for requested property.</returns>
        private static Expression GetPropertyExpressionForProperty(PropertyInfo propertyInfo, ParameterExpression sourceObjectParameter)
        {
            Expression propertyExpression = null;

            if (propertyInfo == null)
            {
                propertyExpression = Expression.Constant(null);
            }
            else
            {
                propertyExpression = Expression.Property(sourceObjectParameter, propertyInfo);
                var propertyType = propertyInfo.PropertyType.GetRealType();

                if (propertyType.IsEnum)
                {
                    // Calling EnumHelper.GetDisplayName(Type enumType, object enumValue)
                    var propertyTypeExpression = Expression.Constant(propertyType);
                    var enumValueExpression    = Expression.Convert(propertyExpression, typeof(object));
                    propertyExpression = Expression.Call(getEnumDisplayNameMethodInfo, propertyTypeExpression, enumValueExpression);
                }
                else if (propertyType.IsValueType)
                {
                    // Calling Convert.ToString(property type, IFormatProvider)
                    var        methodParmetersTypes  = new[] { propertyType, typeof(IFormatProvider) };
                    MethodInfo convertToStringMethod = typeof(Convert).GetMethod("ToString", methodParmetersTypes);

                    var cultureInfo       = CultureInfoHelper.GetCultureInfoForType(propertyType);
                    var cultureExpression = Expression.Constant(cultureInfo);

                    propertyExpression = Expression.Call(convertToStringMethod, propertyExpression, cultureExpression);
                }
            }

            return(propertyExpression);
        }
コード例 #2
0
        private static object GetValue(Type propertyType, string valueAsString)
        {
            var realType = propertyType.GetRealType();

            if (realType.IsEnum)
            {
                return(Enum.Parse(realType, valueAsString));
            }

            var cultureInfo = CultureInfoHelper.GetCultureInfoForType(realType);

            return(Convert.ChangeType(valueAsString, propertyType, cultureInfo));
        }