我正在开发一个模拟游戏,其中在各种类中都有一些条件方法,我希望将它们用于随机游戏中事件。
我的目标是创建一个用户友好的事件类,用户可以在其中通过XML序列化添加事件(该部分很不错)。因此,我试图使事情尽可能简单和通用。我在各种类中都有一些条件方法,例如
public class Person
{
static bool IsOlderThan(int age) {/*...*/}
}
public class Faction
{
static bool HasRelationMoreThan(Faction faction,float value) {/*...*/}
}
以此类推...
我必须定义一个Func <>参数或另一个可以接受具有不同参数范围的方法的委托,而不是为每个参数定义一个不同的字段。 TL; DR:我需要一个接受任何方法作为值的委托类型。
有什么方法可以创建像这样的灵活的通用方法引用吗?
答案 0 :(得分:1)
看看MulticastDelegate类。这是所有代表的基类。 不过要小心。通过DynamicInvoke()调用MulticastDelegates,它的工作速度比Invoke()慢。而且,您还必须控制传递给DynamicInvoke()的参数的数量和类型,因为它可能导致运行时错误。
private void TestMulticastDelegate()
{
Func<int, bool> function1 = IntToBool;
Func<string, bool> function2 = StringToBool;
Func<int, string, bool> function3 = IntAndStringToBool;
int intArg = 1;
string stringArg = "someString";
MulticastDelegate d;
d = new Func<int, bool>(IntToBool);
bool res1 = d.DynamicInvoke(intArg).Equals(function1(intArg)); // always true
d = new Func<string, bool>(StringToBool);
bool res2 = d.DynamicInvoke(stringArg).Equals(function2(stringArg)); // always true
d = new Func<int, string, bool>(IntAndStringToBool);
bool res3 = d.DynamicInvoke(intArg, stringArg).Equals(function3(intArg, stringArg)); // always true
}
private bool IntToBool(int i)
{
return i == 0;
}
private bool StringToBool(string s)
{
return string.IsNullOrEmpty(s);
}
private bool IntAndStringToBool(int i, string s)
{
return i.ToString().Equals(s, StringComparison.OrdinalIgnoreCase);
}