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}); }
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);
}
}
oczywiście w metodzie AddItem powinno być
AddItem‹T›(…
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.
to może coś takiego?
public T Hello‹T›() where T : new()
{
return new T();
}
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
.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.
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