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

时间:2013-07-23 04:28:58

标签: c# enums delegates

我正在尝试在枚举中列出我的一些类'方法,以便我可以根据所选的枚举调用这些方法。我尝试使用ToString()和GetMethod(字符串)没有运气。如果有更好的方法来动态更改我的代表将从枚举列表中调用哪个方法,我将非常感谢您的帮助!我是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");

}

2 个答案:

答案 0 :(得分:1)

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

myDel = eList.ToString();

您可以使用Delegate.CreateDelegate方法。

这样的工作实例方法:

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

或者对于静态方法:

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

注意我假设在两种情况下,方法都是在调用代码的同一个类上定义的。您必须稍微修改一下以调用另一个对象上的方法。

答案 1 :(得分:0)

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

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