2013-07-03 34 views
7

Bir alan için dinamik bir nesnede bir özellikte döngü yapıyorum, ancak fırlatma olmadan mevcut olup olmadığını güvenli şekilde nasıl değerlendireceğimi bilemiyorum. bir istisna. YardımlarınızDinamik bir nesnenin bir alanın olup olmadığını kontrol etme

Şerefe için

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

teşekkürler!

+0

[Nasıl olursa dinamik test etmek olası yinelenen bir özellik mevcuttur] (http://stackoverflow.com/questions/2998954/dynamic-how-to-test-if-property-is-available) –

+0

foreach'ı neden kullanmaya çalışıyorsunuz? var –

+0

Bu en iyi cevap http://stackoverflow.com/questions/2839598/how-to-detect-if-a-property-exists-on-a-dynamic-object-in-c – Ehsan

cevap

1

Dinamik değişkeninizi try catch'la kuşatmanız gerekir, başka bir şey de bunu güvenli bir şekilde yapmanın daha iyi bir yoludur.

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

Bence gitmenin en kolay yolu – MikeW

0

Bu basit olacak. Değerin boş veya boş olduğunu kontrol eden bir koşul belirleyin. Değer mevcutsa, değeri ilgili veri türüne atayın.

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

Her iki "if" içinde 'selectedProductId' seçeneğini işaretlersiniz ifadeleri. – saber

+1

Üzgünüm. Yazım hatası. Bu seçili productCode. –

+1

mülkün kendisi muhtemelen dinamik nesneden eksik değil, değer değil - bu yüzden standart null check ats çağırma istisnası - deneyin {} yakalamak {} işe yarayacak gibi görünüyor – MikeW

1

kullanarak yansıma deneyin yakalamak daha iyidir, bu yüzden bu i kullanmak fonksiyonudur: o zaman

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

..

if (doesPropertyExist(myDynamicObject, "myProperty")){ 
    // ... 
} 
İlgili konular