Я пишу на 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; }
}
Большое спасибо