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

使用共享字典是解决缺少“扩展属性”的好办法吗?

  •  4
  • Dan7  · 技术社区  · 16 年前

    假设我有一些扩展方法,但也需要扩展对象的状态。鉴于C#中不支持扩展属性,使用共享静态字典是一个好的解决方案吗?

    class Foo
    {
            // 3rd party class
    }
    
    static class Helper
    {
        private static Dictionary<Foo, Guid> guidDict = new Dictionary<Foo, Guid>();
    
        public static void DoSomething(this Foo foo)
        {
            Guid guid = guidDict[foo];
            // do stuff
        }
    
        public static void DoAnotherthing(this Foo foo)
        {
            Guid guid = guidDict[foo];
            // do stuff
        }
    
    }
    

    还有什么其他的解决方案?

    4 回复  |  直到 16 年前
        1
  •  3
  •   Marc Gravell    16 年前

    我不确定这是个好主意;同步将是一场噩梦,您需要使用一个不会让所有对象永远存活的密钥( 不要 使用对象引用)。最好在对象内部使用属性包,或者将对象包装在提供缺少属性的其他东西中。您也可以使用继承,但这有更多的限制(您可以封装密封类型或接口)。如果需要,您可以转发成员 想要:

    public class Foo {
        private readonly Bar bar;
        public Foo(Bar bar) { this.bar = bar; }
    
    
        public int Id { get {return bar.Id; } set {bar.Id = value; } }
        public string Name {get;set;}
    }
    
        2
  •  1
  •   LukeH    16 年前

    如果需要扩展对象的状态,我建议 inheritance composition .

        3
  •  1
  •   Patrick Karcher    16 年前

    然而,我认为静态字典也不会有帮助。这可能有利于维护 状态,但不是对象的状态。你是在做下面这些花哨的事情吗?每个实例化对象上都有一个很好的唯一标识符,这样您就可以向字典中添加一个状态变量 键控 对那个目标?如果你想这么做的话,那似乎有点绕圈子了

    假设您无法控制类本身(因此需要以某种方式对其进行扩展),您可以从该对象继承吗?那你当然可以做你需要做的事。

        4
  •  1
  •   jason    16 年前

    decorator pattern )要添加所需的属性?

    我不这么认为。除了同步问题和全局状态问题外,还存在丑陋的对象生存期问题:

    {
        MyObject o = new MyObject();
        PropertyDictionary.Add(o, "SomeExtensionProperty", someValue);
    } 
    

    o