2011-05-24 10 views
8

Tengo un método que toma un nombre de procedimiento almacenado y un Microsoft.VisualBasic.Collection? Me estoy refiriendo a un proyecto de vb en el que tengo que pasar una colección a este método, pero el proyecto actual en el que me encuentro está en C#, ¿así que no estoy seguro de qué puedo pasar al método?¿Qué es equivalente a Microsoft.VisualBasic.Collection en C#?

Aquí es el llamado vb:

public void CallStoredProc(string spName, Microsoft.VisualBasic.Collection params); 

En mi aplicación de C#, tengo que llamar a esto un pase en el C# objeto apropiado para params.

Respuesta

11

Una opción es simplemente usar el tipo Collection directamente desde C#. Este es un tipo estándar en el ensamblaje Microsoft.VisualBasic.dll y se puede usar desde cualquier idioma .Net.

La colección más cercana en el estándar BCL es Hashtable. La conversión entre Hashtable y Collection debe ser bastante sencillo

Por ejemplo

using VBCollection = Microsoft.VisualBasic.Collection; 
... 
public static VBCollection ToVBCollection(this Hashtable table) { 
    var collection = new VBCollection(); 
    foreach (var pair in table) { 
    // Note: The Add method in collection takes value then key. 
    collection.Add(pair.Value, pair.Key); 
    } 
    return collection; 
} 

Nota: Esto no es una asignación directa sin embargo. El tipo Collection admite una serie de operaciones que no le gustan a Hashtable: valores anteriores y posteriores, índice por número o clave, etc. Mi enfoque sería usar un tipo de forma consistente en toda la aplicación y cambiar el proyecto C# o VB apropiadamente

+0

bien, daré una oportunidad, tuve la impresión de que no se podían mezclar los códigos vb y C# en el mismo conjunto – Xaisoft

+4

No se puede mezclar. Eso no significa que no pueda usar tipos de las bibliotecas de los demás ... – Mr47

+0

No puede mezclar código, pero está perfectamente bien haciendo referencia a los ensamblados en VB y C#. – R0MANARMY

5

menos que se puede cambiar el método, por lo que se necesita ICollection, IEnumerable o sus variantes genéricas, que tienen que pasar una instancia de Microsoft.VisualBasic.Collection a ese método.

Desde el punto de vista de C#, Microsoft.VisualBasic.Collection es sólo una clase y se puede trabajar con él como con cualquier otra clase, es decir, instancia que:

new Microsoft.VisualBasic.Collection() 

Por supuesto, usted tiene que hacer referencia al ensamblado de Microsoft .VisualBasic.dll en su proyecto.

+0

No puedo cambiar el método, así que hice este enfoque. – Xaisoft

+0

+1 Para la idea de cambiar el método para tomar un IEnumerable. Hay una forma de que el compilador lo ayude a evitar futuros problemas: marque el ensamblaje de VB como [compatible con CLS] (http://msdn.microsoft.com/en-us/library/12a7a7h3.aspx) y el compilador advertirá. usted si hace algo que hace que su código sea difícil de llamar desde C#, o cualquier otro idioma – MarkJ

+1

@MarkJ, excepto que 'Microsoft.VisualBasic.Collection' * cumple con * CLS, por lo que no habrá ninguna advertencia en este caso. – svick

2

No existe un "objeto C#", o un "objeto VisualBasic.net" - es todo .NET, por lo que simplemente puede incluir una referencia a Microsoft.VisualBasic.dll y usar ese Microsoft.VisualBasic .Colección.

Los desarrolladores de C# a menudo fruncen el ceño ante Microsoft.VisualBasic.dll por el nombre, pero no te comerán los Velociraptors si lo usas, ya que .net es propia y completamente independiente del lenguaje.

+0

Entiendo, cuando dije objeto, solo me refería a la referencia real que se pasa al método. – Xaisoft

+0

Sí, las aves rapaces solo se aprovechan de los que usan 'goto'. – svick

+0

Utilizo goto everywhere, jk. – Xaisoft

Cuestiones relacionadas