我泪流满面,因为我不知道如何使用操作初始化字典

本文关键字:何使用 操作 初始化 字典 我不知道 泪流满面 因为 | 更新日期: 2023-09-27 18:34:16

在具有爆炸功能的Unity项目中,您经常这样做

private Dictionary<string, System.Action> explosions;
void .. initialize in your class constructor .. ()
    {
    explosions = new Dictionary<string, System.Action>();
    explosions.Add("huge", SomeCall);
    explosions.Add("huger", SomeCall);
    etc
    }

没问题,但如果你能做到这一点,我会很高兴的......

private Dictionary<string, System.Action> explosions =
    new Dictionary<string, System.Action>()
    {
    {"huge", SomeCall},
    {"huge", SomeCall},
    etc
    };

那会让我更快乐...你知道当你睡得更好,带着更多的微笑享受饭菜时的感觉吗?

当然,这是行不通的,因为:

资产/脚本/对象/flite 组/真实巨大的爆炸.cs(134,26):错误 CS0236:字段初始值设定项无法引用非静态字段、方法或属性"真的是巨大的爆炸.SomeCall()"

谁能给我带来和平?

有没有办法解决您必须在初始化时执行此操作的事实?

我泪流满面,因为我不知道如何使用操作初始化字典

我喜欢字典初始值设定项,我一直在使用它们。我感受到你的眼泪。

答案在您的问题中,使用代表!

public class ReallyTremendousExplosions
    {
        private delegate void ExplosionFactory(ReallyTremendousExplosions source);
        private Dictionary<string, ExplosionFactory> Explosions = new Dictionary<string, ExplosionFactory>()
        {
            { "huge", x => x.SomeMethod() },
            { "huger", x => x.SomeMethod() }
        };
        private void SomeMethod()
        {
              //Render massive explosions...
        }
        public void RenderNamedExplosion(string explosionName) {
            ExplosionsFactory explosionFactory;
            if (!Explosions.TryGet(explosionName, out explosionFactory) {
                    throw new NoSuchExplosionException(explosionName);
            }
            explosionFactory(this);
        }
    }

代码在 Unity5/Mono 中经过全面测试

似乎SomeCall是一个非静态方法,这就是为什么你不能在字段初始值设定项中使用它的原因。但是,您可以将初始化放入构造函数中:

  public class MyClass {
    ...
    // non static method
    private void SomeCall() { ... }
    private Dictionary<string, System.Action> explosions;
    public MyClass() {
      explosions = new Dictionary<string, System.Action>() {
        {"huge", SomeCall},
        {"huger", SomeCall},
      };
    }
    ...
  }