2013-09-30 3 views
5

Ich habe einen generischen Delegaten, der in einer Singleton-Klasse wie diesem implementiert ist;C# generischer Delegiertenfehler Kann nicht an die Zielmethode binden, da seine Signatur

public class BBCacheMethods 
{ 
    private static BBCacheMethods instance; 

    private BBCacheMethods() { } 

    public static BBCacheMethods Instance 
    { 
     get 
     { 
      if (instance == null) 
      { 
       instance = new BBCacheMethods(); 
      } 

      return instance; 
     } 
    } 

    public T GetResUstPolitikaBelgeTurlerisForCache<T>() where T:class 
    { 
     return null; 
    } 

    public delegate T MethodToInvokeDelegate<T>(); 
    public static MethodToInvokeDelegate<T> MethodToInvoke<T>() where T : class 
    { 
     MethodInfo method = Instance 
      .GetType() 
      .GetMethod("GetResUstPolitikaBelgeTurlerisForCache"); 

     if (null != method) 
     { 
      return (MethodToInvokeDelegate<T>)Delegate.CreateDelegate(
       typeof(MethodToInvokeDelegate<T>), 
       Instance, 
       method); 
     } 
     else 
      throw new FaultException(""); 
    } 

Der Punkt, dass, wenn ich die Delegaten rufe ich diese Fehlermeldung:

Cannot bind to the target method because its signature or security transparency is not compatible with that of the delegate type.

Die Klasse, die die Delegierten auf diese Weise rufen ruft:

public static void loadCache<T>() where T : class 
{ 
    var aa = BBCacheMethods.MethodToInvoke<T>(); 
} 

ich nicht gefunden Warum bekomme ich solch einen Fehler, jede Hilfe wird geschätzt.

Antwort

1

Ich glaube nicht, dass das, was Sie wollen, tatsächlich möglich ist. Das generische Argument T, das in der Delegatspezifikation verwendet wird, muss dasselbe T wie in der Methode GetResUstPolitikaBelgeTurlerisForCache und MethodToInvoke sein, aber das Framework kann dies nicht annehmen.

bekam ich etwas arbeiten, das eine generische Singleton-Klasse verwendet:

public class BBCacheMethods<T> where T:class 
{ 
    private static BBCacheMethods<T> instance; 

    private BBCacheMethods() { } 

    public static BBCacheMethods<T> Instance 
    { 
     get 
     { 
      if (instance == null) 
      { 
       instance = new BBCacheMethods<T>(); 
      } 
      return instance; 
     } 
    } 


    public T GetResUstPolitikaBelgeTurlerisForCache() 
    { 
     return null; 
    } 


    public delegate T MethodToInvokeDelegate(); 

    public static MethodToInvokeDelegate MethodToInvoke() 
    { 

     MethodInfo method = Instance.GetType().GetMethod("GetResUstPolitikaBelgeTurlerisForCache"); 
     if (null != method) 
     { 
      return (MethodToInvokeDelegate)Delegate.CreateDelegate(typeof(MethodToInvokeDelegate), Instance, method); 
     } 
     else 
      throw new FaultException(""); 
    } 

Anschließend können Sie es wie folgt aufrufen:

var aa = BBCacheMethods<T>.MethodToInvoke(); 
var result = aa(); 
+0

Sie vielleicht Recht, es funktioniert gut, aber bin auf der Suche für diese Unterschrift T GetResUstPolitikaBelgeTurlerisForCache () da ich die ganze Klasse nicht mit T. – MuhanadY

+0

dekorieren will Siehe mein Update. Sie könnten stattdessen den erforderlichen Code in eine separate Klasse einfügen und ihn aus Ihrer Singleton-Klasse aggregieren, sodass Sie Ihre Singleton-Klasse nicht mit generischen Typargumenten "dekorieren" müssen. – helb

Verwandte Themen