Является ли использование общих словарей хорошим решением для отсутствия «свойств расширения»? - PullRequest
4 голосов
/ 21 января 2010

Предположим, у меня есть несколько методов расширения, но мне также нужно расширить состояние объекта. Учитывая, что в 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 ]

3 голосов
/ 21 января 2010

Я не уверен, что это хорошая идея; синхронизация была бы кошмаром, и вам нужно было бы использовать ключ, который не рискует сохранить все объекты живыми навсегда ( не использовать ссылку на объект). Лучше использовать пакет свойств внутри объекта или обернуть ваш объект чем-то еще, что обеспечивает отсутствующие свойства. Вы также можете использовать наследование, но оно имеет больше ограничений (вы можете инкапсулировать закрытый тип или интерфейс). Вы можете переслать участников, если вы действительно хотите:

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 голос
/ 21 января 2010

Что не так с обычным решением наследования или композиции объектов ( шаблон декоратора ) для добавления нужных вам свойств?

Было бы хорошим решением использовать общий статический словарь?

Я так не думаю. Помимо проблем с синхронизацией и проблем глобального состояния, у вас также есть проблемы времени жизни уродливых объектов:

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

Сейчас o находится вне области видимости, но в словаре по-прежнему есть ссылка на него! Yucky!

1 голос
/ 21 января 2010

Если вам нужно расширить состояние объекта, я бы порекомендовал наследование или состав .

1 голос
/ 21 января 2010

Вы правы в том, что вы не можете поддерживать состояние с помощью методов расширения, но вы также не сможете поддерживать его с помощью свойств расширения. Они могут манипулировать состоянием только такими способами, к которым у вас в любом случае был бы доступ.

Однако я не верю, что статический словарь тоже поможет. Возможно, было бы хорошо поддерживать состояние shared , но не состояние объекта. Вы делаете что-то необычное, как следующее? Для каждого экземпляра объекта имеется хороший уникальный идентификатор, так что вы можете добавить в словарь переменную состояния, которая будет keyed для этого объекта? Это кажется довольно круглым, если вы пытаетесь это сделать

Предполагая, что у вас нет контроля над самим классом (следовательно, необходимо каким-то образом расширять его), вы можете наследовать от этого объекта? Тогда, конечно, вы можете делать то, что вам нужно.

...