代码之家  ›  专栏  ›  技术社区  ›  Fattie

我哭了,因为我不知道如何用Action字段初始化Dictionary?

  •  3
  • Fattie  · 技术社区  · 10 年前

    在以爆炸为特色的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
        };
    

    那会让我更开心……你知道当你睡得更好,享受更多的微笑时的那种感觉吗?

    当然,这行不通,因为:

    资源/脚本/对象/飞行组/真正的巨大爆炸。cs(134,26):error CS0236:字段初始值设定项无法引用非静态字段、方法或属性“RealyTremendousExplosions.SomeCall()”

    有人能给我带来和平吗?

    有没有办法避免在初始化时必须这样做?

    2 回复  |  直到 10 年前
        1
  •  3
  •   Tewr    10 年前

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

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

    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/单声道。

        2
  •  1
  •   Dmitrii Bychenko    10 年前

    看来 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},
          };
        }
        ...
      }