Showing posts with label C#. Show all posts
Showing posts with label C#. Show all posts

Thursday, July 10, 2014

C# - Assign one class properties to another class properties using reflection

Following code helpful to assign properties of one class to another class object

 public static void MapProperties<T1, T2>(T1 destinationClass, T2 sourceClass)
        {
            if (destinationClass != null & sourceClass != null)
            {
                Type destinationType = destinationClass.GetType();
                Type sourceType = sourceClass.GetType();


                foreach (PropertyInfo sourceProperty in
                    sourceType.GetProperties())
                {
                    if (sourceProperty.CanRead)
                    {
                        string propertyName = sourceProperty.Name;
                        Type propertyType = sourceProperty.PropertyType;

                        PropertyInfo destinationProperty =
                            destinationType.GetProperty(propertyName);
                        if (destinationProperty != null)
                        {
                            Type toPropertyType = destinationProperty.PropertyType;

                           if (toPropertyType == propertyType && destinationProperty.CanWrite)
                            {
                             object sourceValue = sourceProperty.GetValue(sourceClass, null);
                            destinationProperty.SetValue(destinationClass, sourceValue, null);
                            }
                        }
                    }
                }
            }

        }

Wednesday, June 25, 2014

MVC Razor - Enum Drop List


To Bind Enum value in Drop Down use the following

CSHTML

To display list of enum and select the value

@Html.EnumDropDownList(model => model.State, new { Id = "ddlState" })


To display list of enum item and keep binding when save/modify

@Html.EnumDropDownListFor(model => model.StateSelected, Model.State, new { Id = "ddlState" })

Note: model.StateSelected is int value.



Model

private int _StateSelected = 1;
public int StateSelected
{
  get { return _StateSelected; }
  set { _StateSelected = value; }
}


private State _State = 1;
public State State 
{
  get { return _State; }
  set { _Statevalue; }
}


Note: State is enum


public enum State
        {
            Tamilnadu =1,
            Karnadaka,
            ..
       
        }



Helper Class

  /// <summary>
        /// Enums the drop down list for.
        /// </summary>
        /// <typeparam name="TModel">The type of the model.</typeparam>
        /// <typeparam name="TEnum">The type of the enum.</typeparam>
        /// <param name="htmlHelper">The HTML helper.</param>
        /// <param name="expression">The expression.</param>
        /// <param name="htmlAttributes">The HTML attributes.</param>
        /// <returns></returns>
        public static MvcHtmlString EnumDropDownList<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression, object htmlAttributes = null)
        {

            ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);

            Type enumType = GetNonNullableModelType(metadata);
            Type baseEnumType = Enum.GetUnderlyingType(enumType);

            IEnumerable<SelectListItem> items = from value in enumType.GetFields(BindingFlags.Static | BindingFlags.GetField | BindingFlags.Public)
                                                select new SelectListItem()
                                                {
                                                    Text = GetEnumDisplayValue(value),
                                                    Value = Convert.ChangeType(value.GetValue(null), baseEnumType).ToString(),
                                                    Selected = (value.GetValue(null).Equals(metadata.Model))
                                                };


            return SelectExtensions.DropDownList(htmlHelper, "EnumDropDown", items, htmlAttributes);

        }

        /// <summary>
        /// Enums the drop down list for.
        /// </summary>
        /// <typeparam name="TModel">The type of the model.</typeparam>
        /// <typeparam name="TEnum">The type of the enum.</typeparam>
        /// <typeparam name="TProperty">The type of the property.</typeparam>
        /// <param name="htmlHelper">The HTML helper.</param>
        /// <param name="expression">The expression.</param>
        /// <param name="enumType">Type of the enum.</param>
        /// <param name="htmlAttributes">The HTML attributes.</param>
        /// <returns></returns>
        public static MvcHtmlString EnumDropDownListFor<TModel, TEnum, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression, TProperty enumType, object htmlAttributes = null)
        {

            ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);

            Type baseEnumType = Enum.GetUnderlyingType(typeof(TProperty));

            IEnumerable<SelectListItem> items = from value in typeof(TProperty).GetFields(BindingFlags.Static | BindingFlags.GetField | BindingFlags.Public)
                                                select new SelectListItem()
                                                {
                                                    Text = GetEnumDisplayValue(value),
                                                    Value = Convert.ChangeType(value.GetValue(null), baseEnumType).ToString(),
                                                    Selected = (value.GetValue(null).Equals(metadata.Model))
                                                };

            return SelectExtensions.DropDownListFor(htmlHelper, expression, items, htmlAttributes);
        }

        /// Gets the enum display value.
        /// </summary>
        /// <param name="field">The field.</param>
        /// <returns></returns>
        private static string GetEnumDisplayValue(FieldInfo field)
        {
            string text;

            DescriptionAttribute[] attributes =
           (DescriptionAttribute[])field.GetCustomAttributes(
           typeof(DescriptionAttribute),
           false);

            if (attributes != null &&
                attributes.Length > 0)
            {
                text = attributes[0].Description;
            }
            else
            {
                text = field.Name;
            }
            return text;
        }


        /// <summary>
        /// Gets the type of the non nullable model.
        /// </summary>
        /// <param name="modelMetadata">The model metadata.</param>
        /// <returns></returns>
        private static Type GetNonNullableModelType(ModelMetadata modelMetadata)
        {
            Type realModelType = modelMetadata.ModelType;
            Type underlyingType = Nullable.GetUnderlyingType(realModelType);

            if (underlyingType != null)
            {
                realModelType = underlyingType;
            }

            return realModelType;
        }