2010-06-12 9 views
1

Dans ce post, il existe une manière très intéressante de mettre à jour les threads de l'interface utilisateur à l'aide d'une méthode d'extension statique. Ce que je veux faire, est de faire une version générique, donc je ne suis pas contraint par un contrôle. Cela me permettrait de faire ce qui suit par exemple (parce que je ne suis pas contraint plus à être juste un contrôle)Création de la méthode d'extension Générique

this.progressBar1.InvokeIfRequired(pb => pb.Value = e.Progress); 

J'ai essayé ce qui suit:

public static void InvokeIfRequired<T>(this T c, Action<T> action) where T : Control 
    { 
     if (c.InvokeRequired) 
     { 
      c.Invoke(() => action(c)); 
     } 
     else 
     { 
      action(c); 
     } 
    } 

Mais j'obtenir ce qui suit erreur que je ne suis pas sûr de savoir comment réparer. Quelqu'un a des suggestions?

Erreur 5 Impossible de convertir l'expression lambda de type 'System.Delegate' parce qu'il est pas un type de délégué

+0

En fait ... à la recherche d'un peu plus près, il me semble obtenir l'erreur sur le premier exemple de code aussi ... bien que je suis en train de compiler pour .NET 4.0 pour le moment. – Ian

Répondre

4

remplacer:

c.Invoke(() => action(c)); 

avec:

c.Invoke(action, c); 
0

Ceci est une erreur bien connue avec lambdas et méthodes anonymes:

Convert this delegate to an anonymous method or lambda

Votre code a juste besoin d'un casting pour compiler:

public static void InvokeIfRequired<T>(this T c, Action<T> action) where T : Control 
{ 
    if (c.InvokeRequired) 
    { 
     c.Invoke((Action<T>)((control) => action(control))); 
    } 
    else 
    { 
     action(c); 
    } 
} 
+0

ne fonctionnera pas non plus. Vous devez fournir l'argument de l'action à la méthode 'Invoke' –

0

Essayez cette légère Varient:

public static void InvokeIfRequired<T>(this T c, Action<T> action) where T : Control 
{ 
    if (c.InvokeRequired) 
    { 
     c.Invoke((Action<T>)(() => action(c))); 
    } 
    else 
    { 
     action(c); 
    } 
} 

Vous devez jeter comme un type de délégué. Un peu stupide, je sais. Je ne peux pas vraiment vous donner une bonne raison pour laquelle une expression lambda n'est pas implicitement assignable en tant que délégué.

+0

Cela ne fonctionnera pas, car' action' prend un paramètre, et vous ne le passez pas à 'Invoke' –

+0

bon point. édité pour tenir compte de cela. pour une raison que je pensais Invoke passé dans le contrôle actuel, ce qui est totalement pas le cas. – ckramer

Questions connexes