![]() |
Zugriff auf Methode einer generischen Liste
Hallo,
Ich habe eine Liste
Code:
Nun habe ich eine Methode mit folgender Signatur, der eine Instanz von MyList<?> übergeben wird:
class MyList<T> where T : MyObject
{ public void Foobar() }
Code:
Ich will also ein Objekt auf eine generische Liste casten, und dann eine bestimmte Methode dieser Listenklasse aufrufen. Es ist egal, von welchem Typ die Elemente sind ('T' ist also unerheblich).
void CallFooBar (object obj)
{ // sowas will ich // ((MyList<???>)obj).FooBar; } |
AW: Zugriff auf Methode einer generischen Liste
Hiho,
Wenn du Kontrolle über die generische klasse hast, solltest du dort ein nicht-generisches Interface "implementieren" welches nur diese eine Methode kennt.
Code:
interface ISample
{ void Fobar(); } class MyList<T> : ISample { void Foobar() { ... } }
Code:
Wenn du keine Kontrolle über besagte Klasse hast, musst du Reflection nehmen:
var miep = 0 new MyList<int>();
object untypedRef = miep; var mööp = untypedRef as ISample; if(mööp != null) mööp.Foobar();
Code:
Da das ständige Nachslagen Zeit dauert, ist es dann besser, den Call in einem Delegate pro Type abzulegen:
var mi = untypedRef.GetType().GetMethod("Foobar", BindingFlags.Public | BindingFlags.Instance);
mi.DynamicInvoke(untypedRef, null);
Code:
Das ist zwar viel langsamer als die erste Variante (ohne Reflection), aber besser als ständig Reflection anzuwerfen ist es auf jeden Fall, gerade wenn man es öfter aufruft...
static class Miep
{ static readonly IDictionary<Type, Action<Object>> FoobarCallsByType = new Dictionary<Type, Action<Object>>(); public static void InvokeFoobar(Object callee) { var typeRef = callee.GetType(); lock(FoobarCallsByType) { Action<Object> foobar; if(!FoobarCallsByType.TryGetValue(typeRef, out foobar)) { var mi = typeRef.GetMethod("Foobar", BindingFlags.Public | BindingFlags.Instance); FoobarCallsByType.Add(typeRef, foobar = (Action<Object>)Delegate.CreateDelegate(typeof(Action<Object>), mi)); } } foobar(callee); } } |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz