2010-06-17 12 views
9

Tengo una aplicación WinForms C# 3.0 que ocasionalmente se requiere para controlar Excel con automatización. Esto está funcionando muy bien con el enlace temprano normal, pero he tenido algunos problemas cuando las personas no tienen Excel instalado pero aún quieren usar mi aplicación a excepción de la parte de Excel. El enlace tardío parece ser una solución a esto. La unión tardía es bastante tediosa en C# 3, pero no estoy haciendo nada particularmente difícil. Estoy siguiendo http://support.microsoft.com/kb/302902 como titular y está funcionando bien.Cómo obtener un valor de enum de un ensamblado utilizando el enlace tardío en C#

Mi pregunta es ¿cómo puedo usar una enumeración por nombre?

por ejemplo, ¿cómo puedo usar la reflexión para obtener el valor de Microsoft.Office.Interop.Excel.XlFileFormat.xlTextWindows para que pueda usarlo una llamada InvokeMethod?

Sé que la manera más fácil es probablemente crear mi propia enumeración local con el mismo valor entero "mágico", pero sería mejor poder acceder a ella por su nombre. Los documentos a menudo no muestran el valor, así que para obtenerlo, probablemente necesite una pequeña aplicación de prueba que me indique el valor.

Gracias

+0

¿Cómo consiguió el objeto Asamblea Excel en el código? Estoy utilizando el enlace tardío también y si obtengo el tipo de uno de los objetos de excel que tengo, dice que provienen de mscorlib porque son objetos COM. – skeletank

Respuesta

15

Los valores de enumeración se consideran campos para que pueda utilizar el método Type.GetField para obtener el valor de una opción de enumeración a través de la reflexión.

Un ejemplo condensada:

namespace ConsoleApp 
{ 
    enum Foo { Bar = 5 } 

    class Program 
    { 
     static void Main() 
     { 
      // Get the assembly containing the enum - Here it's the one executing 
      var assembly = Assembly.GetExecutingAssembly(); 

      // Get the enum type 
      var enumType = assembly.GetType("ConsoleApp.Foo"); 

      // Get the enum value 
      var enumBarValue = enumType.GetField("Bar").GetValue(null); 

      // Use the enum value 
      Console.WriteLine("{0}|{1}", enumBarValue, (int)enumBarValue); 
     } 
    } 
} 

Salidas:

// Bar|5 
0

Dado el siguiente ejemplo:

enum Test 
{ 
    Value1, 
    Value2 
} 

puedo conseguir una lista de valores y nombres de la siguiente manera:

foreach (var enumValue in typeof(Test).GetEnumValues()) 
{ 
    string name = enumValue.ToString(); 
    int value = (int) enumValue; 
} 
Cuestiones relacionadas