使用共享字典是缺乏“扩展属性”的好方法吗?

时间:2010-01-21 16:26:46

标签: c# inheritance dictionary extension-methods

假设我有一些扩展方法,但也需要扩展对象的状态。看到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 个答案:

答案 0 :(得分:3)

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

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;}
}

答案 1 :(得分:1)

您是正确的,因为您无法使用扩展方法维护状态,但也无法使用扩展属性。他们只能以你本来可以访问的方式操纵状态。

但是,我不相信静态词典也会有所帮助。维护共享状态可能是好的,但不是对象的状态。你做的事情如下吗?每个实例化对象上都有一个很好的唯一标识符,这样您就可以将一个状态变量添加到 keyed 到该对象的字典中?如果这就是你正在尝试的事情,这似乎有点圆了

假设你无法控制类本身(因此需要以某种方式扩展它),你可以继承这个对象吗?当然,你可以做你需要做的事。

答案 2 :(得分:1)

如果您需要扩展对象的状态,我建议您inheritancecomposition

答案 3 :(得分:1)

通常的继承或对象组合解决方案(decorator pattern)添加您需要的属性有什么问题?

  

使用共享静态字典是一个很好的解决方案吗?

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

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

现在o超出了范围,但字典仍然有引用它!令人讨厌!