2013-09-30 9 views
5

Ho un delegato generico implementato in una classe singleton come questa;C# errore di delegato generico Impossibile collegarsi al metodo di destinazione perché la sua firma è

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(""); 
    } 

Il punto che quando invoco il delegato ricevo questo errore:

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

La classe che chiama il delegato chiamano in questo modo:

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

non ho trovato fuori perché ricevo un tale errore, ogni aiuto è apprezzato.

risposta

1

Non penso che quello che vuoi sia effettivamente possibile. L'argomento generico T utilizzato nella specifica del delegato deve essere lo stesso T del metodo GetResUstPolitikaBelgeTurlerisForCache e MethodToInvoke ma il framework non può presumere questo.

ho qualcosa di lavoro che utilizza una classe Singleton generico:

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(""); 
    } 

Si può quindi invocare come segue:

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

potresti avere ragione funziona benissimo, ma sono alla ricerca di questa firma T GetResUstPolitikaBelgeTurlerisForCache () lì per non voglio decorare l'intera classe con T. – MuhanadY

+0

Vedere il mio aggiornamento. Si potrebbe invece inserire il codice richiesto in una classe separata e aggregarlo dalla classe singleton in modo da non dover "decorare" la classe singleton con argomenti di tipo generico. – helb