如何通过反射调用带有枚举(enum)参数的方法

本文关键字:enum 参数 方法 枚举 反射 何通过 调用 | 更新日期: 2023-09-27 17:50:17

我必须调用以下方法:

public bool Push(button RemoteButtons)

RemoteButtons的定义如下:

enum RemoteButtons { Play, Pause, Stop }

Push方法属于remoteccontrol类。remoteccontrol类和RemoteButton枚举都位于我需要在运行时加载的程序集中。我可以这样加载程序集并创建remoteccontrol的实例:

Assembly asm = Assembly.LoadFrom(dllPath);
Type remoteControlType = asm.GetType("RemoteControl");
object remote = Activator.CreateInstance(remoteControlType);

现在,我如何调用Push方法,知道它的唯一参数是一个枚举,我也需要在运行时加载?

如果我在c# 4上,我将使用dynamic对象,但我在c# 3/上。. NET 3.5,所以不能用

如何通过反射调用带有枚举(enum)参数的方法

假设我有以下结构:

public enum RemoteButtons
{
    Play,
    Pause,
    Stop
}
public class RemoteControl
{
    public bool Push(RemoteButtons button)
    {
        Console.WriteLine(button.ToString());
        return true;
    }
}

然后我可以使用反射来获得如下值:

Assembly asm = Assembly.GetExecutingAssembly();
Type remoteControlType = asm.GetType("WindowsFormsApplication1.RemoteControl");
object remote = Activator.CreateInstance(remoteControlType);
var methodInfo = remoteControlType.GetMethod("Push");
var remoteButtons = methodInfo.GetParameters()[0];
// .Net 4.0    
// var enumVals = remoteButtons.ParameterType.GetEnumValues();
// .Net 3.5
var enumVals = Enum.GetValues(remoteButtons.ParameterType);
methodInfo.Invoke(remote, new object[] { enumVals.GetValue(0) });   //Play
methodInfo.Invoke(remote, new object[] { enumVals.GetValue(1) }); //Pause
methodInfo.Invoke(remote, new object[] { enumVals.GetValue(2) }); //Stop

我从方法中获取参数类型,然后从该类型中获取enum值。

下面的代码可以正常工作!

asm = Assembly.LoadFrom(dllPath);
Type typeClass = asm.GetType("RemoteControl");
obj = System.Activator.CreateInstance(typeClass);
Type[] types = asm.GetTypes();
Type TEnum = types.Where(d => d.Name == "RemoteButtons").FirstOrDefault();
MethodInfo method = typeClass.GetMethod("Push", new Type[] { TEnum});
object[] parameters = new object[] { RemoteButtons.Play };
method.Invoke(obj, parameters);

注意这个代码:" Type TEnum = types.Where(d => d.Name == "RemoteButtons").FirstOrDefault(); "必须使用此代码从程序集获取类型。

但不直接用typeof(RemoteButtons)找到这样的方法:"MethodInfo method = typeClass.GetMethod("Push", new Type[] { typeof(RemoteButtons) });"这实际上不是同一类型。