AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen .NET-Sprachen Zugriff auf Methode einer generischen Liste
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriff auf Methode einer generischen Liste

Ein Thema von Iwo Asnet · begonnen am 15. Feb 2012 · letzter Beitrag vom 5. Mär 2012
Antwort Antwort
Iwo Asnet

Registriert seit: 11. Jun 2011
313 Beiträge
 
#1

Zugriff auf Methode einer generischen Liste

  Alt 15. Feb 2012, 10:52
Hallo,

Ich habe eine Liste
Code:
class MyList<T> where T : MyObject
{
  public void Foobar()
}
Nun habe ich eine Methode mit folgender Signatur, der eine Instanz von MyList<?> übergeben wird:
Code:
void CallFooBar (object obj)
{
  // sowas will ich
  // ((MyList<???>)obj).FooBar;
}
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).
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#2

AW: Zugriff auf Methode einer generischen Liste

  Alt 5. Mär 2012, 22:30
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:
 var miep = 0 new MyList<int>();
object untypedRef = miep;
var mööp = untypedRef as ISample;
if(mööp != null)
  mööp.Foobar();
Wenn du keine Kontrolle über besagte Klasse hast, musst du Reflection nehmen:
Code:
var mi = untypedRef.GetType().GetMethod("Foobar", BindingFlags.Public | BindingFlags.Instance);
mi.DynamicInvoke(untypedRef, null);
Da das ständige Nachslagen Zeit dauert, ist es dann besser, den Call in einem Delegate pro Type abzulegen:
Code:
 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);
  }
}
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...
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz