如何使用多个可选参数定义一个灵活的委托字段?

时间:2019-03-15 17:04:33

标签: c# delegates func

我正在开发一个模拟游戏,其中在各种类中都有一些条件方法,我希望将它们用于随机游戏中事件。

我的目标是创建一个用户友好的事件类,用户可以在其中通过XML序列化添加事件(该部分很不错)。因此,我试图使事情尽可能简单和通用。我在各种类中都有一些条件方法,例如

public class Person
{
    static bool IsOlderThan(int age) {/*...*/}
}

public class Faction
{
    static bool HasRelationMoreThan(Faction faction,float value) {/*...*/}
}

以此类推...

我必须定义一个Func <>参数或另一个可以接受具有不同参数范围的方法的委托,而不是为每个参数定义一个不同的字段。 TL; DR:我需要一个接受任何方法作为值的委托类型。

有什么方法可以创建像这样的灵活的通用方法引用吗?

1 个答案:

答案 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);
}