/// <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); }
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)); }