Как добавить несколько свойств с одинаковым именем в динамике в C #? - PullRequest
0 голосов
/ 25 декабря 2011

У меня есть dynamic скажем d.Я добавляю к нему некоторые свойства, выполняя следующие действия:

((IDictionary<String, Object>)d).Add("Propname", Propvalue);

Теперь, когда у меня есть свойства с одинаковым именем, это, очевидно, вызывает исключение.Я хочу разрешить все свойства, даже если они имеют одно и то же имя.Таким образом, Словарь - это неправильный выбор структуры данных.Я думал о BAG-эквиваленте JAVA в C #.Я не мог ничего найти.Как лучше всего это сделать?

Ответы [ 2 ]

5 голосов
/ 25 декабря 2011

Вы, кажется, полностью смешиваете несколько концепций.

dynamic - это триггер, который заставляет компилятор генерировать код с поздней привязкой.Хотя это не проверяется во время компиляции, оно следует тем же правилам, что и обычный код C #.Он не может иметь многозначных свойств (можете ли вы иметь их где-нибудь в .NET?).Единственный способ - иметь свойство со значением коллекции и добавлять новые значения в коллекцию.Примерно так:

dynamic obj = new ExpandoObject();
obj.SomeProperty = new List<object>();

obj.SomeProperty.Add(SomeValue);
obj.SomeProperty.Add(AnotherValue);

foreach(var somePropertyValue in obj.SomeProperty)
{
  DoSmth(somePropertyValue);
}

dynamic не имеет ничего общего с IDictionary или Lookup.Переменная dynamic может быть произвольным объектом, например, значением int.Если вы используете dynamic, очень странно, что вы приводите его к интерфейсу IDictionary.Просто позвоните Add, и DLR разрешит для вас метод (как я делал выше).

Обычно вы должны использовать dynamic, только если вы взаимодействуете с динамической средой (языки сценариев, COM и т. Д.).Если вы работаете только с кодом C # - отбросьте все динамические вещи и используйте обычные коллекции .NET.Он будет статически проверен компилятором и будет работать быстрее.

Например, вы можете использовать Dictionary<string, ICollection<object>>, чтобы иметь динамический словарь:

var dictionary = new Dictionary<string, ICollection<object>>();
dictionary["SomeProperty"] = new List<object>();

dictionary["SomeProperty"].Add(SomeValue);
dictionary["SomeProperty"].Add(AnotherValue);

foreach(var somePropertyValue in dictionary["SomeProperty"])
{
  DoSmth(somePropertyValue);
}

UPDATE

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

4 голосов
/ 25 декабря 2011

Не совсем уверен, что вы хотите, чтобы ожидаемое поведение было, но если вы хотите, чтобы под одним именем свойства было сохранено более 1 элемента, вы можете использовать класс System.Linq.Lookup вместо словаря. .

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