2013-05-08 7 views
6

ho una libreria di classi eredità VB.Net che include alcuni metodi di estensione, una delle quali è più o meno questo:Come posso utilizzare metodi di estensione VB.Net in un progetto C#

Namespace Extensions 
    Public Module OrmExtensions 

     <Extension()> 
     Public Function ToDomainObjectCollection(ByRef objects As OrmCollection(Of OrmObject)) As DomainObjectCollection 
      Return objects.AsQueryable().ToDomainObjectCollection() 
     End Function 

     <Extension()> 
     Public Function ToDomainObjectCollection(ByRef objects As IQueryable(Of OrmObject)) As DomainObjectCollection 
      Dim doc As New DomainObjectCollection() 
      For Each o In objects 
       doc.Add(o.ToDomainObject()) 
      Next 
      Return doc 
     End Function 
    End Module 
End Namespace 

Per utilizzare queste estensioni in VB Devo solo importare Extensions.OrmExtensions. Ho un altro progetto, che è in C# che dipende da quello VB con le estensioni e non riesco a farli funzionare. OrmExtensions non è disponibile e utilizza semplicemente lo spazio dei nomi VBProject.Extensions non rende disponibili le estensioni.

Ci sono più progetti che dipendono dal progetto VB e idealmente le estensioni dovrebbero essere disponibili a tutti loro.

Ho fatto un bel po 'di ricerca su google, ma non sono stato in grado di rivelare nulla sull'utilizzo effettivo dei metodi di estensione VB in C#. Presumo il problema è che sono tenuti a essere in un modulo, ma non sono stato in grado di confermarlo.

Preferisco non duplicare i metodi di estensione ovunque siano richiesti (specialmente nel nostro progetto di test unitario, che si trova in C#).

+0

È necessario estendere "IEnumerable ", non "IQueryable ". – SLaks

+0

Cosa succede se, in C# con l'uso corretto, si digita 'OrmExtensions' e si cercano i metodi? Come appaiono? Sembrano metodi di estensione validi? –

+0

compila il metodo di estensione come libreria esterna e quindi aggiungi un riferimento a tale libreria dal tuo C# projet –

risposta

5

Non si dovrebbe usare ByRef.

VB.Net (apparentemente) supporta i metodi di estensione sui parametri ref; C# (giustamente) no.

Un parametro ByRef (ref in C#) consente al metodo di assegnare una nuova istanza alla variabile o al campo passato dal chiamante.
Dovrebbero essere usati raramente.

+1

Puoi chiarire "correttamente"? –

+3

(E il fatto che siano qui usati probabilmente indica una mancanza di comprensione del significato di ByRef, che dovrebbe essere affrontato.) –

+0

@EricJ .: beh per una cosa il valore di 'objects' non è cambiato in uno di questi metodi. Perché vorresti che fosse 'ByRef'? E cosa significherebbe * per essere 'ByRef' con un valore che cambia? Cosa succederebbe se lo chiamassi sul risultato di una chiamata al metodo, ad esempio? –

Problemi correlati