2009-10-05 6 views
31

Je veux le faire, mais à obtenir cette erreur:Utilisation de méthodes d'extension dans .NET 2.0?

Error 1 Cannot define a new extension method because the compiler required type 'System.Runtime.CompilerServices.ExtensionAttribute' cannot be found. Are you missing a reference to System.Core.dll? [snipped some path stuff]

J'ai vu des réponses ici qui dit, vous devez définir vous-même attribut.

Comment faire cela?

EDIT: C'est ce que j'ai:

[AttributeUsage (AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] 
public sealed class ExtensionAttribute : Attribute 
{ 
    public static int MeasureDisplayStringWidth (this Graphics graphics, string text) 
    { 

    } 
} 
+1

Non; vous avez besoin de * deux * classes; un pour l'attribut; un pour la (les) méthode (s) d'extension; mettra à jour. –

Répondre

58

comme ceci:

// you need this once (only), and it must be in this namespace 
namespace System.Runtime.CompilerServices 
{ 
    [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class 
     | AttributeTargets.Method)] 
    public sealed class ExtensionAttribute : Attribute {} 
} 
// you can have as many of these as you like, in any namespaces 
public static class MyExtensionMethods { 
    public static int MeasureDisplayStringWidth (
      this Graphics graphics, string text) 
    { 
      /* ... */ 
    } 
} 

Alternativement; il suffit d'ajouter une référence à LINQBridge.

+0

Merci Marc, c'était en fait ton article que j'ai lu. J'ai juste essayé mais ai obtenu ceci: Erreur Les méthodes d'extension doivent être définies dans une classe statique non générique, où j'ai une méthode comme ceci: public static int MeasureDisplayStringWidth (ce graphiques de graphiques, ...) –

+0

Également ExtensionAttribute peut avoir un nom, n'est-ce pas? Et pourquoi hériter de l'attribut? –

+3

Vous devez hériter de l'attribut pour qu'il soit un attribut ... et il doit s'appeler ExtensionAttribute pour que le compilateur puisse le trouver. (C'est ce à quoi il s'attend qu'il soit appelé.) Votre erreur est probablement que ce n'est pas dans une classe statique. –

Questions connexes