Как получить значение перечисления из сборки с помощью позднего связывания в 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;
}