Итерация через динамический объект

Используя mvc, я получаю такие значения, чтобы избежать деклараций классов и изменений маршрутизатора.

public dynamic Create([FromBody] dynamic form)
{
    var username = form["username"].Value;
    var password = form["password"].Value;
    var firstname = form["firstname"].Value;
...

Мне нравится перебирать все значения и проверять их на нуль или пусто.

Ответ 1

Если вы получите json из аргумента, вы можете преобразовать его в Dictionary<string, dynamic>, где клавиша string - это имя свойства, а dynamic - это значение, которое может принимать любой тип. Для образца:

var d = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(form);

var username = d["username"];

Вы также можете переключаться между свойством Keys из Dictionary<>:

foreach(var key in d.Keys)
{
   // check if the value is not null or empty.
   if (!string.IsNullOrEmpty(d[key])) 
   {
      var value = d[key];
      // code to do something with 
   }
}

Ответ 2

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

var data = (IDictionary<string, object>)form;

Ответ 3

Вы можете использовать JavaScriptSerializer и динамический объект:

JavaScriptSerializer serializer = new JavaScriptSerializer();

dynamic myDynamicObject = serializer.DeserializeObject(json);

Например, если вы хотите выполнить цикл через myDynamicObject["users"]:

foreach (KeyValuePair<string, dynamic> user in myDynamicObject["users"]){
    Console.WriteLine(user.Key+": "+user.Value["username"]);
    Console.WriteLine(user.Key+": "+user.Value["email"]);
}