假设我有一些扩展方法,但也需要扩展对象的状态。看到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
}
}
还有哪些其他解决方案?
答案 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)
如果您需要扩展对象的状态,我建议您inheritance或composition。
答案 3 :(得分:1)
通常的继承或对象组合解决方案(decorator pattern)添加您需要的属性有什么问题?
使用共享静态字典是一个很好的解决方案吗?
我不这么认为。除了同步问题和全局状态问题之外,您还遇到了丑陋的对象生存期问题:
{
MyObject o = new MyObject();
PropertyDictionary.Add(o, "SomeExtensionProperty", someValue);
}
现在o
超出了范围,但字典仍然有引用它!令人讨厌!