使用枚举列表作为具有委托的方法

本文关键字:方法 枚举 列表 | 更新日期: 2023-09-27 18:24:16

我正试图在枚举中列出一些类的方法,以便根据所选的枚举调用这些方法。我尝试使用ToString()和GetMethod(string),但没有成功。如果有更好的方法可以动态更改我的委托将从枚举列表中调用的方法,我将感谢您的帮助!我是C#的新手,我还想知道是否有其他存储方法指针的方法。我仔细观察了这些板上的倒影,在选角或从枚举中分配时运气都不好。

public enum funcEnum { FirstFunction, SecondFunction };
public funcEnum eList;
public delegate void Del();
public Del myDel;

void Start() {
    myDel = FirstFunction; //pre-compiled assignment
    myDel(); //calls 'FirstFunction()' just fine

下面的内容可以在运行时更改,它通常不会出现在Start()中

    eList = funcEnum.SecondFunction; //this could be changed during runtime
    myDel = eList.ToString();

明显的错误,myDel正在寻找方法,不确定如何检索/转换枚举值到要分配给委托的方法,试图在事先知道分配的情况下调用方法。基本上希望枚举列表包含此类中方法的名称。

    myDel(); //doesn't work
}

public void FirstFunction() {
    Debug.Log("First function called");
}
public void SecondFunction() {
    Debug.Log("Second function called");
}

使用枚举列表作为具有委托的方法

不能简单地将字符串分配给方法/委托。取而代之的是:

myDel = eList.ToString();

可以使用Delegate.CreateDelegate方法。

类似这样的东西适用于工作实例方法:

myDel = (Del)Delegate.CreateDelegate(typeof(Del), this, eList.ToString());

或者这是静态方法:

myDel = (Del)Delegate.CreateDelegate(typeof(Del), this.GetType(), eList.ToString());

注意,我假设在这两种情况下,方法都是在调用代码的同一个类上定义的。您必须对此进行一点修改才能调用另一个对象上的方法。

如果您感兴趣,另一种选择是通过MethodInfo:使用反射

var method = typeof(YourClass).GetMethod(eList.ToString());
method.Invoke(new YourClass(), null);