我有一个C#3.0 WinForms应用程序,偶尔需要通过自动化控制Excel。这与正常的早期绑定很好地工作,但是当人们没有安装Excel但仍想使用我的应用程序时,我有一些问题,除了Excel部分。后期绑定似乎是解决这个问题的方法。在C#3中,后期绑定相当繁琐,但我没有做任何特别困难的事情。我跟随http://support.microsoft.com/kb/302902作为首发,并且运作良好。
我的问题是如何按名称使用枚举?
例如,如何使用反射来获取Microsoft.Office.Interop.Excel.XlFileFormat.xlTextWindows
的值,以便我可以使用InvokeMethod
调用?
我知道最简单的方法可能是使用相同的“魔术”整数值创建我自己的本地枚举,但是能够通过名称访问它会更好。文档通常不会列出值,所以为了得到它我可能需要一个早期绑定测试应用程序,可以告诉我的价值。
由于
答案 0 :(得分:15)
枚举值被视为字段,因此您可以使用方法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
答案 1 :(得分:0)
Enum.Parse会有帮助吗?例如
// given this enum
enum MyEnum
{
Value1,
Value2
}
// you can get the value via string
MyEnum value = (MyEnum)Enum.Parse(typeof(MyEnum), "Value1");
答案 2 :(得分:0)
给出以下示例:
enum Test
{
Value1,
Value2
}
我可以得到一个像这样的值和名称列表:
foreach (var enumValue in typeof(Test).GetEnumValues())
{
string name = enumValue.ToString();
int value = (int) enumValue;
}