Сбайндить один тип в другой и передать в Invoke методе
От: TheAteist  
Дата: 24.11.10 09:11
Оценка:
Я пишу на MVC

Есть несколько классов(например "User", "Role"...). В каждом из них есть метод "Update". Но, каждый "Update" принимает параметр другого типа.
Например "User.Update" принимает "UserGridRow", "Role.Update" принимает "RolesGridRow" и т.д.

В функции "Invoke" я передаю параметр типа "System.Web.Mvc.FormCollection". Я хочу, чтоб при вызове "User.Update", "UserGridRow" заполнился данными из "FormCollection" и передался методу "User.Update". А при вызове "Role.Update", "RolesGridRow" заполнился данными из "FormCollection" и передался методу "Role.Update".

Я сделал вроде такого Байндера, но когда какой-та "Property" в UserGridRow или в RolesGridRow не string, а integer, то Байндер "кричит"

Правильно ли я сделал или есть более грамотный способ? И правильно ли Байндер написал?

Вот мой код
public partial class BackOfficeController : Controller
{
    public void ProcessGridData(FormCollection data)
    {
        string classType = data["type"].Replace("Grid", "");        
        var type = Type.GetType(string.Format("{0}.{1},{2}", ModelType, classType, ModelAssembly), true);
        type.GetMethod("Update").Invoke(type, BindingFlags.IgnoreCase, new MyBinder(), new object[] { data }, new System.Globalization.CultureInfo("en-US", false));
    }
}
public class MyBinder : Binder
{
    public override object ChangeType(object value, Type type, System.Globalization.CultureInfo culture)
    {
        var col = (FormCollection)value;
        var instance = Activator.CreateInstance(type);
        foreach (PropertyInfo prop in instance.GetType().GetProperties())
        {
            string propName = prop.Name;
            var propToSet = instance.GetType().GetProperty(propName, BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Public);
            if (propToSet != null)
            {
                prop.SetValue(instance, col[propName], null);
            }
        }
        return instance;
    }
}

[KnownType(typeof(UserGridRow))]
[DataContract(Namespace = "")]
public class UserGridRow : JGridDataModelRow
{
    [DataMember(Name = "id")]
    public int Id { get; set; }
    [DataMember(Name = "username")]
    public string UserName { get; set; }
    [DataMember(Name = "password")]
    public string Password { get; set; }
}

[KnownType(typeof(RolesGridRow))]
[DataContract(Namespace = "")]
public class RolesGridRow : JGridDataModelRow
{
    [DataMember(Name = "id")]
    public int Id { get; set; }
    [DataMember(Name = "role")]
    public string Role { get; set; }
}


Большое спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.