Metoda generyczna oraz przeładowana nakładka na nią z parametrem Type

Załóżmy, że mamy metodę generyczną:

private void ShowView<T>(object pars)

Teraz chcemy zdefiniować nakładkę na nią, która zamiast parametru T przyjmowałaby Type:

private void ShowView(Type type, object pars)

Dodatkowym wymogiem jest niedublowanie logiki zwartej w tej metodzie. Aby wywołać wersję generyczną z niegenerycznej należy użyć mechanizmu refleksji:

private void ShowView(Type type, object pars)
{
    MethodInfo methodInfo=GetType().GetMethod("ShowView");
    MethodInfo genericMethod= methodInfo.MakeGenericMethod(type);
    genericMethod.Invoke(this,new object[]{pars});
}

7 thoughts on “Metoda generyczna oraz przeładowana nakładka na nią z parametrem Type”

  1. albo coś przeoczyłem albo w .net-cie 4.0 zaszły zmiany bo metody generyczne (takie jak podałeś w przykładzie) możemy po prosty wywołać z niegenerycznych. (przykład poniżej)

    class Program
    {
    static void Main(string[] args)
    {
    var klasaTestowa = new JakasKlasa();
    klasaTestowa.AddItemNonGeneric(“hello world”);
    }

    }

    public class JakasKlasa
    {
    public void AddItem(T value)
    {
    Console.Write(value.GetType().ToString());
    }

    public void AddItemNonGeneric(object value)
    {
    AddItem(value);
    }
    }

  2. Może trochę zly przykład dałem – zaaktualizowałem już na ShowView. Generlanie chodzi o metody, ktore jako parametr nie przyjmuja generics – generic sluzy wylacznie do przekazanai typu. W przypadku ShowView dajemy typ widoku ktory chcemy wyswietlic. Czasami takie konstrukcje maja miejsce.

  3. Nie da się tego zrobic bez refleksji. Metoda generyczna ShowView wykorzystuje w kodzie T jako typ (GetType). Na podstawie widoku tworzy np. ViewModel itp.

    Nie da sie wywolac czegos takiego:
    Type t=…
    ShowView();

    a chcemy cos takiego miec:
    ShowView(t);

    Pozdrawiam
    Piotr

  4. .MakeGenericMethod zapamietam bo może się przydać, chociaż z drugiej strony po co rezygnować z generic-ów jeżeli są? Możesz podać jakis przykład bo szczerze powiedziawszy nic mi narazie nie przychodzi do głowy.

  5. W pracy mialem po prostu metode typu ShowView(), ktora wykorzystywala T jako typ do tworzenia view modelu itp.
    Ja z kolei typ wczytywalem z pliku – tzn dynamicznie uzyskiwalem klasę Type.
    Dysponowalem wiec instanacja Type i na podstawie tego chcialem pokazac widok tzn:
    Type type=ReadType();
    ShowView(type);
    Musialem wiec dopisac dodatkowa “nakladke”. Bo nie da sie zrobic w tym przypadku czegos takiego jak ShowView();

Leave a Reply

Your email address will not be published.