2010-12-22 12 views
1

ich eine generische Methode in einer Klasse haben alsC# generische Methodenaufruf statische Funktion

folgt
private static Dictionary<Type, Feed> _singletons = new Dictionary<Type, Feed>(); 

    public static Feed GetFeed<T>() where T:Feed 
    {  
     lock(_padlock) 
     { 
      if (!_singletons.ContainsKey(typeof(T)) 
      {     
       _singletons[typeof(T)] = typeof(T).GetInstance(); 
      } 
      return _singletons[typeof(T)];   
     } 
    } 

Hier ist Feed eine Schnittstelle und Type ist von Typen von Klassen, die die Feed-Schnittstelle implementieren. GetInstance() ist eine statische Methode in diesen Klassen. Ist etwas nicht in Ordnung mit typeof(T).GetInstance();? Es heißt System.Type enthält keine Definition für GetInstance().

+1

Weil 'typeof()' gibt ein 'Objekt Baumuster zum . Die 'Type' Klasse hat keine solche Methode. – BoltClock

+0

Ja. Diesen Teil bekomme ich. Was ist die Alternative zu diesem Anruf? – Aks

+0

Der Operator 'typeof (T)' gibt eine Instanz von 'System.Type' zurück, keine Instanz von' T'. Nun, nachdem das gesagt wurde, denke ich, dass du wirklich darüber nachdenken solltest, was auch immer du versuchst zu schreiben. Singleton ist ein sehr fieses Anti-Pattern und in Kombination mit Reflektionsmagie scheint es, als ob Sie sich für eine Anwendung fragwürdiger Wartbarkeit einsetzen. Fragen Sie sich, welchen Vorteil Sie mit Ihrem Typwörterbuch haben: Warum sollte ein Client 'var x = Feeds.GetFeed ()' anstelle von 'var x = new MyFeedImpl()' schreiben? – Juliet

Antwort

2

Sie Reflection verwenden können, um eine statische Methode, wie so zu nennen:

private static Dictionary<Type, Feed> _singletons = new Dictionary<Type, Feed>(); 

public static Feed GetFeed<T>() where T:Feed 
{  
    lock(_padlock) 
    { 
     if (!_singletons.ContainsKey(typeof(T)) 
     {     
      return typeof(T).GetMethod("GetInstance", System.Reflection.BindingFlags.Static).Invoke(null,null); 

     } 
     return _singletons[typeof(T)];   
    } 
} 
+0

Sie werden BindingFlags.Public ebenso benötigen. –

2

Der einfachste Weg ist die new Einschränkung

private static Dictionary<Type, Feed> _singletons = new Dictionary<Type, Feed>(); 

public static Feed GetFeed<T>() where T:Feed, new() 
{  
    lock(_padlock) 
    { 
     if (!_singletons.ContainsKey(typeof(T)) 
     {     
      _singletons[typeof(T)] = new T(); 
     } 
     return _singletons[typeof(T)];   
    } 
} 
Verwandte Themen