Как ввернуть родителя в child для вызова правильной функции в C# - PullRequest
3 голосов
/ 02 марта 2020

Сначала я работаю над 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 ''

Спасибо за помощь? Я много читаю, но теперь я полностью потерян.

Ответы [ 2 ]

2 голосов
/ 02 марта 2020

Вместо:

GetMethod("Cast")

... попробуйте эту перегрузку:

GetMethod("Cast", new Type[] { typeof(Object) })

Дополнительные наблюдения .. .

Метод Cast<T> класса form_base равен , а не stati c. (См. Выше, чтобы получить это.)

Класс form_base не определяет любые publi c stati c методы.

(Примечание стороны Я не уверен, почему класс extensions определен как partial.)

Метод Cast<T> в классе extensions равен stati c, но не метод расширения.

Чтобы получить этот, вы можете использовать эту перегрузку для типа extensions:

typeof(extensions).GetMethod("Cast", BindingFlags.Public | BindingFlags.Static, null, new Type[] { typeof(Object) }, null)

Если вы определили метод Cast<T> extension в классе extensions:

public static partial class extensions {
    public static T Cast<T>(this form_base b, object o) {/*…*/}
}

... тогда вы можете получить его с той же перегрузкой для типа extensions, путем изменения аргумента types:

typeof(extensions).GetMethod("Cast", BindingFlags.Public | BindingFlags.Static, null, new Type[] { typeof(form_base), typeof(Object) }, null)
0 голосов
/ 11 марта 2020

Наконец ... С простым примером это хорошо

using System;
using System.Collections.Generic;
using System.Reflection;

namespace ConsoleApp1
{
  abstract public class form_base
  {
    public Guid Guid { get; set; }

}
public class form_Frais : form_base
{
    public int MonInt { get; set; }

    public static T Cast<T>(object o)
    {
        return (T)o;
    }
}
public class form_Avoir : form_base
{
    public int MonInt { get; set; }

    public static T Cast<T>(object o)
    {
        return (T)o;
    }
}

public static class extensions
{
    public static int GetCardModel(this form_Avoir form)
    {
        return form.MonInt * 100;
    }

    public static int GetCardModel(this form_Frais form)
    {
        return form.MonInt * form.MonInt;
    }
}

public class TOTO
{
    public static int GetCardModel(form_Avoir form)
    {
        return form.MonInt * 100;
    }

    public static int GetCardModel(form_Frais form)
    {
        return form.MonInt * form.MonInt;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");
        form_Frais nf = new form_Frais();
        nf.Guid = Guid.NewGuid();
        nf.MonInt = 2;
        List<form_base> lst = new List<form_base>();
        //MethodInfo[] methodInfos = typeof(form_base).GetMethods(BindingFlags.Public | BindingFlags.Static);
        lst.Add(nf);
        form_Avoir av = new form_Avoir();
        av.Guid = Guid.NewGuid();
        av.MonInt = 5;
        lst.Add(av);

        foreach (dynamic f in lst)
        {
            Console.WriteLine(TOTO.GetCardModel(f)); // OK
            //Type LeTyp = f.GetType();
            //MethodInfo MI = LeTyp.GetMethod("Cast");//<T>.getMethod(cast)
            //MI = MI.MakeGenericMethod(typeof(form_base));
            //dynamic t = MI.Invoke(null, new object[] { f });
            //Console.WriteLine(t.GetCardModel());// Error 
        }
    }
  }
}

Моя ошибка состояла в том, что я думал, что в объект включены методы расширения. На самом деле нет. Кажется, но не совсем. Я просто меняю метод с параметром вместо расширения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...