2013-07-03 12 views
7

Pętlę przechodzę przez właściwość dynamicznego obiektu szukającego pola, z tym wyjątkiem, że nie mogę wymyślić, jak bezpiecznie ocenić, czy istnieje, czy nie, bez rzucania wyjątek.Jak bezpiecznie sprawdzić, czy obiekt dynamiczny ma pole, czy nie?

 foreach (dynamic item in routes_list["mychoices"]) 
     { 
      // these fields may or may not exist 
      int strProductId = item["selectedProductId"]; 
      string strProductId = item["selectedProductCode"]; 
     } 

Dzięki za pomoc

Cheers!

+0

możliwe duplikat [dynamiczny, Jak sprawdzić, czy właściwość jest dostępna] (http://stackoverflow.com/questions/2998954/dynamic-how-to-test-if-a-property-is-available) –

+0

dlaczego próbujesz użyć foreach (dynamiczny element mrówki do justowania var –

+0

To jest najlepsza odpowiedź http://stackoverflow.com/questions/2839598/how-to-detect-if-a-property-exists-on-a-dynamic-object-in-c-pl – Ehsan

Odpowiedz

1

Musisz otaczać zmienną dynamiczną próbą catch, nic innego nie jest lepszym sposobem na bezpieczne wykonanie.

try 
{ 
    dynamic testData = ReturnDynamic(); 
    var name = testData.Name; 
    // do more stuff 
} 
catch (RuntimeBinderException) 
{ 
    // MyProperty doesn't exist 
} 
+0

najprostszy sposób na zrobienie – MikeW

0

To będzie proste. Ustaw warunek, który sprawdza, czy wartość jest pusta lub zerowa. Jeśli obecna jest wartość, przypisz wartość do odpowiedniego typu danych.

foreach (dynamic item in routes_list["mychoices"]) 
     { 
      // these fields may or may not exist 

      if (item["selectedProductId"] != "") 
      { 
       int strProductId = item["selectedProductId"]; 
      } 

      if (item["selectedProductCode"] != null && item["selectedProductCode"] != "") 
      { 
       string strProductId = item["selectedProductCode"]; 
      } 
     } 
+0

Sprawdzasz 'selectedProductId' zarówno w" if " sprawozdania. – saber

+1

Przepraszamy. Literówka. To jest wybraneProductCode. –

+1

sama właściwość jest prawdopodobnie nieobecna w dynamicznym obiekcie, a nie w wartości - tak więc standardowa kontrola zerowa rzuca wyjątek wywołania - spróbuj {} catch {} wydaje się, że to robisz, ale – MikeW

1

stosując odbicie jest lepsza niż try-catch, więc jest to funkcja używam:

public static bool doesPropertyExist(dynamic obj, string property) 
{ 
    return ((Type)obj.GetType()).GetProperties().Where(p => p.Name.Equals(property)).Any(); 
} 

następnie ..

if (doesPropertyExist(myDynamicObject, "myProperty")){ 
    // ... 
} 
Powiązane problemy