Вы, кажется, полностью смешиваете несколько концепций.
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 .Но сначала подумайте, действительно ли вам нужны все эти сложные вещи.