Сначала я работаю над c # / Code У меня есть родительский класс abstract public class form_base {}
и несколько разных дочерних классов. Вот один из них
public class form_Frais : form_base {
}
У меня есть представление со всеми form_base, но когда я нажимаю на один, я открываю общий шаблон. Мне просто нужно изменить отображение в соответствии с дочерним типом при изменении контроллера / функции по URL-адресу
Тогда в моей базе form_base у меня было это:
public T Cast<T>(object o)
{
return (T)o;
}
public dynamic converttt(Type LeTyp)
{
MethodInfo castMethod = GetType().GetMethod("Cast").MakeGenericMethod(new[] { LeTyp });
dynamic castedObject = castMethod.Invoke(Activator.CreateInstance(LeTyp), new object[] { this });
return castedObject;
}
Я разделил свой проект на 2 part (engine / Web) Мои классы определены в engine
Моя проблема - заполнить мой список всех form_base в веб-части. Я использую эту функцию в части контроллера
public ActionResult demandeur()
{
object model;
model = new { formsList = (from f in CurrentDBContext.forms_base select f).ToList().getCardModel(false) };
}
return View("demandeur", model);
}
И в сети я создаю методы расширения (я не буду видеть в части двигателя) publi c stati c частичные расширения класса {
public static List<formListItem> getCardModel(this List<form_base> items, bool envalidation)
{
List<formListItem> model = new List<formListItem>();
if (items != null && items.Count > 0)
{
foreach (var item in items)
{
Type LeTyp = item.GetType().BaseType;
dynamic castedObject = item.converttt(LeTyp);//Pb here not good type : System.Data.Entity.DynamicProxies.form_Frais_353DEAA5...' ne contient pas de définition pour 'getCardModel''
model.Add(castedObject.getCardModel(envalidation));
}
}
return model;
}
public static formListItem getCardModelBase(this form_base f)
{
formListItem model = new formListItem();
model.id = f.id;
model.libelle = f.title;
model.libelleType = f.formType.title;
model.libelleStatut = f.StatutInterneLibelle;
model.demandeur = f.demandeur.fullName;
model.idtype = f.formType.id;
return model;
}
public static formListItem getCardModel(this form_Frais form, bool envalidation)
{
formListItem model = ((form_base)form).getCardModelBase();
model.URL = "/forms/NoteFrais/InitForm"; //The good URL
model.envalidation = envalidation;
return model;
}
}
Я пытаюсь поместить все в часть расширения следующим образом:
public static T Cast<T>(object o)
{
return (T)o;
}
public static List<formListItem> getCardModel(this List<form_base> items, bool envalidation)
{
List<formListItem> model = new List<formListItem>();
if (items != null && items.Count > 0)
{
foreach (var item in items)
{
Type LeTyp = item.GetType().BaseType;
MethodInfo castMethod = item.GetType().BaseType.GetMethod("Cast").MakeGenericMethod(new[] { LeTyp });
dynamic castedObject = castMethod.Invoke(null, new object[] { item });
model.Add(castedObject.getCardModel(envalidation));
}
}
return model;
}
public static formListItem getCardModelBase(this form_base f)
{
formListItem model = new formListItem();
model.id = f.id;
model.libelle = f.title;
model.libelleType = f.formType.title;
model.libelleStatut = f.StatutInterneLibelle;
model.demandeur = f.demandeur.fullName;
model.idtype = f.formType.id;
return model;
}
Но у меня есть ошибка в item.GetType (). BaseType.GetMethod ("Cast"). MakeGenericMethod (new [] {LeTyp}); причина GetMethod ("Cast") возвращает ноль
Все мои исследования происходят от здесь
ОБНОВЛЕНИЕ
В резюме, с первой попытки, я проблема типа возвращаемого класса dynamicproxy ... И в stati c версии, я не могу найти метод Cast ..
Я пытаюсь
MethodInfo[] methodInfos = LeTyp.GetMethods(BindingFlags.Public | BindingFlags.Static);
Но мой массив пуст .. тогда моя проблема в stati c версии будет правильно сохранять мою функцию Case ??? и использую его в методе расширения
UPDATE 3
Я нахожу проблему в режиме stati c Мне нужно положить функцию Cast в класс note_frais и использовать ее
Type LeTyp = item.GetType().BaseType;
//MethodInfo[] methodInfos = LeTyp.GetMethods(BindingFlags.Public | BindingFlags.Static);
MethodInfo MI = LeTyp.GetMethod("Cast");//<T>.getMethod(cast)
MI = MI.MakeGenericMethod(typeof(form_base));
dynamic t = MI.Invoke(null, new object[] { item });
model.Add(t.getCardModel(envalidation));
Но теперь у меня один и тот же pb из 2-х частей:
// Pb здесь не очень хороший тип: System.Data.Entity.DynamicProxies.form_Frais_353DEAA5 ... не определено как определение для getCardModel ''
Спасибо за помощь? Я много читаю, но теперь я полностью потерян.