使用 'delegate float' 统计浮点数加法

Statistic float addition using 'delegate float'

我正在构建一个统计系统。在系统中,某些统计数据依赖于其他统计数据来计算其最终值。这是我最初的尝试:

public class ModdedStat
{
    public delegate float Mod();
    public Mod mod;
    public float baseStat;
    public float finalStat
    {
        get
        {
            return baseStat + mod();
        }
    }
}

不幸的是,这是 return baseStat + 最后一个订阅 mod 的侦听器。我测试如下:

stat.baseStat = 0;
stat.mod += Out1;
stat.mod += Out2;
Console.Write(stat.finalStat);

Out1和Out2分别是return1和2的函数。控制台写入 returned '2'。

我以前从未使用过 return 类型的委托,所以我不确定我的逻辑有什么问题。是否有类似的解决方案,甚至是完全不同的解决方法?

感谢您的帮助!

发生这种情况是因为默认情况下,调用多播将 运行 您使用 += 添加的所有委托,但 return 值 returned 将是一个从你添加的最后一个。毕竟一次调用只能return一个值

如果您想要输出 3,您可以使用 GetInvocationList 获取您使用 += 添加到多播委托的委托。然后,您可以遍历数组并向上添加 return 值。

public float finalStat
{
    get
    {
        float totalMod = 0;
        foreach(Mod m in mod.GetInvocationList()) {
            totalMod += m();
        }
        return baseStat + totalMod;
    }
}

在这种情况下使用 delegateGetInvocationList 的替代方法是 Func:

var funcs = new List<Func<int>>();
funcs.Add(Out1);
funcs.Add(Out2);

funcs.Sum(f => f());

或使用您的 class:

public class ModdedStat
{
    readonly List<Func<int>> funcs = new List<Func<int>>();

    public void AddFunc(Func<int>)
    {
        funcs.Add(func);
    }

    public float baseStat;
    public float finalStat => baseStat + funcs.Sum(f => f());
}

然后:

stat.baseStat = 0;
stat.AddFunc(Out1);
stat.AddFunc(Out2);
Console.Write(stat.finalStat);