Имея ту же работу класса, что и сумка свойств и ряд свойств - PullRequest
0 голосов
/ 02 ноября 2010

Мой класс C # работает как держатель значений, которые теперь хранятся в виде свойств.В целях повышения расширяемости я собираюсь добавить в него словарь, чтобы люди могли хранить там любые свойства, которые им нужны, без необходимости изменения кода класса.Однако я хотел бы сохранить обратную совместимость, позволяя по-прежнему получать доступ к старым свойствам либо через средство доступа к пакету, либо через исходный метод получения.Т.е. я хочу, чтобы следующие две части кода имели одинаковый эффект.

properties.Config1 = value
properties["Config1"] = value

У кого-нибудь есть какие-либо советы по передовым методам такого изменения?Одна сложность заключается в том, что в некоторых существующих методах получения есть валидация / логика.

Ответы [ 5 ]

3 голосов
/ 02 ноября 2010

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

Если вы делаете это с индексатором, у вас есть возможность поместить существующие свойства в Словарь или просто оставить их как есть и вызвать их существующие методы получения и установки из метода получения / установки индексатора, когда соответствующая строка передается как ключ.

Индексатор может выглядеть примерно так:

public object this[string key] {
    get {
        if (key == "Config1") return this.Config1;
        else return propBag[key];
    }
    set {
        if (key == "Config1") this.Config1 = value;
        else propBag[key] = value;
    }
}

Конечно, вы можете добавить проверки, чтобы убедиться, что ключ существует в блоке else, но это должно помочь вам начать работу.


Еще одна вещь, которую следует учитывать: изменение этого класса для добавления поведения мешка свойств, независимо от того, реализовано ли оно как общедоступный словарь или индексатор, приведет к изменению интерфейса класса. Таким образом, вам не нужно будет переписывать существующий код, но вам придется перекомпилировать его после изменения класса.

1 голос
/ 02 ноября 2010

Не могли бы вы просто заменить ссылки на внутренние поля '_config1', чтобы они указывали на хранилище словаря?Вам нужно было бы реализовать некоторую логику, чтобы проверить, существует ли ключ словаря и т. Д., Но это не должно быть столь монументальным изменением.

1 голос
/ 02 ноября 2010

Используйте ExpandoObject, который фактически является словарем строки / объекта с синтаксическим сахаром:

http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject.aspx

Иметь properties как ExpandoObject. Вот пример из MSDN:

dynamic employee = new ExpandoObject();
employee.Name = "John Smith";
employee.Age = 33;

foreach (var property in (IDictionary<String, Object>)employee)
{
    Console.WriteLine(property.Key + ": " + property.Value);
}
// This code example produces the following output:
// Name: John Smith
// Age: 33
0 голосов
/ 06 декабря 2012

Ниже приведена довольно хорошая статья, касающаяся некоторых аспектов разработки кода, для тех, кто хочет создать класс типа PropertyBag и кто не хочет использовать System.Dynamic

http://www.codeproject.com/Articles/12282/Implementing-a-PropertyBag-in-C

0 голосов
/ 13 июня 2012

Я сам собираюсь реализовать нечто похожее на это, и проблемы с обратной и прямой совместимостью являются проблемами.

Я хочу использовать отражение в моем пакете свойств, чтобы проверить, реализует ли базовый класс это свойствоявно, и если это так, пусть Property Bag ссылается на базовую реализацию.

Например, если мой класс реализует:

string MyClass.Name

Тогда внутренне сумка свойств будет использовать отражение дляпереадресация запросов от MyClass.Properties["Name"] до MyClass.Name

Это может вызвать проблемы.Если пользователи моего класса, например, настроили специальное свойство list(of string) MyClass.Properties["Address"], а затем я реализую свойство по умолчанию string Myclass.Address - это, очевидно, приведет к нарушению кода пользователя.

Это неЭто не проблема для окружающей среды, в которой я работаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...