2010-09-16 5 views
2

Existe-t-il un moyen d'utiliser des méthodes d'extension sur une classe qui a été créée dynamiquement à l'aide de Relection.Emit? Par exemple:Utilisation de méthodes d'extension avec des assemblys d'exécution

class somewhere 
{ 
    somewhere() 
    { 
     // define the type here using ReflectionEmit, etc. 
     Type tableType = CreateTableType(...table parameters...); 

     var table = Activator.CreateInstance(tableType); 
     table.Shuffle(); 
    } 
} 

//... elsewhere 
public class static TableTypeExtensions 
{ 
     public static Table Shuffle(this Table t) 
     { 
      ... 
     } 
} 

Mais je n'ai pas la classe par le nom "Table", uniquement TypeTableType disponible.
Y a-t-il un moyen de contourner cela?
Merci

Répondre

3

Définissez une classe de base commune pour votre TableType et définissez la méthode d'extension sur celle-ci. De cette façon, votre méthode d'extension devrait également être disponible pour les classes dérivées.

+0

Je préfère la suggestion d'interface, mais c'est bien aussi. –

+0

D'accord. Upvoted il. –

+0

Je l'ai utilisé dans mon code final. Il est plus logique pour moi d'ajouter des fonctionnalités à une classe qu'à une interface. –

4

Rendre la classe dynamique implémenter une interface (vide si vous le souhaitez), ajouter des extensions à l'interface.

+0

@downvoter Pourquoi le downvote? C'est une bonne et commune solution à la question de l'OP "Y at-il un moyen d'utiliser des méthodes d'extension sur une classe qui a été créée dynamiquement en utilisant Relection.Emit?". –

3

Regardons ce que vous demandez.

Vous demandez comment faire fonctionner la méthode d'extension sur votre instance d'objet.

De toute évidence, pour que cela fonctionne, il doit s'agir d'un Table, sinon votre question n'a aucun sens.

Il suffit donc de le jeter aux Table:

var table = (Table)Activator.CreateInstance(tableType); 

et vous pouvez appeler votre méthode d'extension très bien.

+0

Vous n'êtes pas obligé de le lancer dans sa classe de base. La méthode d'extension est également disponible sur les types dérivés. –

+3

S'il construit le type par réflexion, il n'a pas le type dérivé en tant que "type" en soi, seulement l'instance d'objet. Et le résultat de Activator.CreateInstance est de type 'object'. La distribution est juste pour que le compilateur reconnaisse le type correct. –

+0

Je pense que mon échantillon est trop simpliste. Je n'ai pas de classe Table définie nulle part. La tableType est définie par recordType = moduleBuilder.DefineType ("name"); TableType = typeof (BindingList <>). MakeGenericType (recordType); –

0

Dans votre code somewhere avez-vous référence au type Table? Si oui, vous pouvez:

Type tableType = CreateTableType(...table parameters...); 

var table = Activator.CreateInstance(tableType) as Table; 
table.Shuffle(); 
+0

Vous devez utiliser un cast, pas "as". – Timwi

Questions connexes