Как в C# удалить свойство из ExpandoObject?

Скажем, у меня есть этот объект:

dynamic foo = new ExpandoObject();
foo.bar = "fizz";
foo.bang = "buzz";

Например, как удалить foo.bang?

Я не хочу просто присваивать свойству значение null — для моих целей мне нужно его вообще удалить. Кроме того, я понимаю, что могу создать совершенно новый ExpandoObject, рисуя пары kv из первого, но это было бы довольно неэффективно.


person Matt Cashatt    schedule 23.01.2013    source источник


Ответы (4)


Приведите расширение к IDictionary<string, object> и вызовите Remove:

var dict = (IDictionary<string, object>)foo;
dict.Remove("bang");
person Jon    schedule 23.01.2013
comment
я знаю, что это было довольно давно, но нашел это сегодня, и это помогло мне решить проблему, когда мне пришлось удалить все свойства из динамического/ExpandoObject, содержащегося в списке. это был буквально один лайнер (чтобы соответствовать OP, используя bang!!): bangItems.All(x =› ((IDictionary‹string, object›) x).Remove(bang)); - person jim tollan; 12.05.2021
comment
Код в ответе bangItems.All(x => ((IDictionary<string, object>) x).Remove("bang")); не работает? Предупреждаю, что кто-то может запутаться. - person Saiyaff Farouk; 04.08.2021

Вы можете рассматривать ExpandoObject как IDictionary<string, object> вместо этого, а затем удалите его следующим образом:

IDictionary<string, object> map = foo;
map.Remove("Jar");
person Jon Skeet    schedule 26.11.2012
comment
нужно удалить элемент 'Jar' из Foo.. не Foo сам по себе.., - person Dhanapal; 26.11.2012
comment
@Dhana: Так что измените Foo на Jar :) Я обновил пример, но если вы понимаете, как должен работать ответ, вам не составит труда исправить это самостоятельно... - person Jon Skeet; 26.11.2012

Пример MSDN:

dynamic employee = new ExpandoObject();
employee.Name = "John Smith";
((IDictionary<String, Object>)employee).Remove("Name");
person Simon Whitehead    schedule 23.01.2013

Вы можете привести его к типу IDictionary<string,object>, а затем использовать явный метод Remove. .

IDictionary<string,object> temp = foo;
temp.Remove("bang");
person Reed Copsey    schedule 23.01.2013