Как получить значение перечисления из сборки с помощью позднего связывания в C#

у меня есть приложение C# 3.0 WinForms, которое иногда требуется для управления Excel с помощью автоматизации. Это хорошо работает с нормальной ранней привязкой, но у меня были некоторые проблемы, когда люди не установили Excel, но все еще хотят использовать мое приложение, за исключением части Excel. Позднее связывание-видимому, решение этого. Поздняя привязка довольно утомительна в C# 3, но я не делаю ничего особенно сложного. Я следую http://support.microsoft.com/kb/302902 как a стартер и он работает хорошо.

мой вопрос в том, как я могу использовать перечисление по имени?

e.g, как я могу использовать отражение, чтобы получить значение Microsoft.Office.Interop.Excel.XlFileFormat.xlTextWindows чтобы я мог использовать его InvokeMethod звонок?

Я знаю, что самый простой способ-это, вероятно, создать мое собственное локальное перечисление с тем же" магическим " целочисленным значением, но было бы лучше иметь доступ к нему по имени. Документы часто не перечисляют значение, поэтому, чтобы получить его, мне, вероятно, нужно иметь немного раннее приложение для тестирования, которое может скажи мне цену.

спасибо

3 ответов


значения перечисления считаются полями, поэтому вы можете использовать метод Type.GetField чтобы получить значение параметра перечисления через отражение.

краткий пример:

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);
        }
    }
}

выходы:

// Bar|5


приводит следующий пример:

enum Test
{
    Value1,
    Value2
}

Я могу получить список значений и имен такой:

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