[C#] Cum se apelează o metodă generică prin Reflection

Pentru o scurtă introducere în lb. engleză în metodele generice în C# clic aici [1]. Pentru introducerea din documentația oficială C# în modulul Reflection, clic aici [2].

Echivalentul nefuncționalei formulări (extrasă dintr-un proiect, pentru caz mai simplu vedeți restul articolului):

    StergeRandCuCheiaPrimaraEgalaCu<cell.ValueType>(cell.Value);

este: 

    MethodInfo method = typeof(ClientiExistenti)
         .GetMethod("StergeRandCuCheiaPrimaraEgalaCu");
    MethodInfo generic = method.MakeGenericMethod(cell.ValueType);
    generic.Invoke(this, new object[] { cell.Value });

și nu trebuie omis rândul următor de la începutul fișierului .cs:
    using System.Reflection;

Capturi de ecran

1. Aici definim funcția privată nestatică generică MetodaGenerica:


2. Aici scriem cod care testează metoda din captura de mai sus.


3. Prezentăm abilitatea compilatorului C# de a deduce tipul generic.



4. Aici apare eroare fiindcă fără Reflection nu putem folosi un tip cunoscut doar la rulare ci un tip cunoscut și la compilare.



5. Aici folosim Reflection și dacă rulăm, nu va funcționa, deoarece metoda apelată prin Reflection trebuie să fie statică și publică:


6. Am rescris metoda și variabilele de care depinde pentru a fi publică și statică:




7. La rulare, apare următoarea fereastră (MessageBox):



Codul din penultima captură de mai sus

using System;
using System.Reflection;
using System.Windows.Forms;

namespace cs_reflection_metoda_generica
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public static object camp = null;
        public static string tipCamp = null;

        public static void MetodaGenerica<T>(T x)
        {
            camp = x;
            tipCamp = typeof(T).ToString();
        }

        private void Form1_Load(
            object sender, EventArgs e)
        {
            object x;

            // Aici se atribuie lui x
            // fie un `int`, fie un `string`.
            // Exemplu:
            x = 8;

            // Dacă vrem în loc de `int` un tip
            // știut doar în momentul rulării...
            //MetodaGenerica<x.GetType()>(x); // Eroare.

            // Metoda de mai jos cere ca metoda
            // apelată să fie statică și publică:
            MethodInfo method = typeof(Form1)
                .GetMethod("MetodaGenerica");
            MethodInfo generic = method.MakeGenericMethod(
                x.GetType());
            generic.Invoke(this, new object[] { x });

            MessageBox.Show($"{camp} " +
                $"este de tip {tipCamp}.");
        }
    }
}

Niciun comentariu:

Trimiteți un comentariu