2012-06-05 12 views
5

Mam dynamiczny obiekt, który wygląda następująco:Obiekt dynamiczny - Jak określić, czy właściwość jest zdefiniowana?

this.ChartDetails.Chart 

„Schemat” jest dynamiczna. Chcę sprawdzić, czy istnieje właściwość dynamiczna na wykresie o nazwie LeftYAxis. Jaki jest najlepszy sposób na wykonanie dynamicznych obiektów?

Nie sądzę, że jest to duplikat How to detect if a property exists on an ExpandoObject?, ponieważ nie omawia najlepszej metody wykonania tego dla obiektów dynamicznych.

+0

jeśli this.ChartDetails.Chart.LeftYAxis! = Null –

+0

Czy to jest * swoją * realizacja DynamicObject? – Tigran

+3

możliwy duplikat [jak wykryć, czy właściwość istnieje w obiekcie dynamicznym w C#?] (Http://stackoverflow.com/questions/2839598/how-to-detect-if-a-property-exists-on-a -dynamiczny-obiekt-w-c) – jason

Odpowiedz

6
bool isDefined = false; 
object axis = null; 
try 
{ 
    axis = this.ChartDetails.Chart.LeftYAxis; 
    isDefined = true; 
} 
catch(RuntimeBinderException) 
{ } 

To właśnie dzieje się w środowisku wykonawczym. (W przypadku dostępu do własność „dynamiczny” kawałek rzeczy dzieje się tylko wtedy, gdy wyjątek pierwszej szansy pobiera obsługiwane przez przesłonić obiektu z DynamicObject „s TryGetMember i TrySetMember

niektórych obiektów (jak ExpandoObject) są rzeczywiście słowniki pod maską i można sprawdzić bezpośrednio w następujący sposób:

bool isDefined = ((IDictionary<string, object>)this.ChartDetails.Chart) 
    .ContainsKey("LeftYAxis"); 

zasadzie: nie wiedząc, co rzeczywisty typ ChartDetails.Chart jest (jeśli jest to ExpandoObject zwykły ol”podklasa object lub podklasą DynamicObject) nie ma mowy, oprócz spróbuj/złap wyżej. Jeśli napisałeś kod ChartDetails i Chart lub masz dostęp do kodu źródłowego, możesz określić, jakie metody istnieją dla obiektu i użyć ich do sprawdzenia.

5

Z różnych powodów najlepiej jest unikać bloków try/catch do sterowania przepływem. Dlatego też, podczas gdy metoda Krzysztofa osiąga pożądany rezultat, uważam to korzystne:

this.ChartDetails.Chart.GetType().GetProperty("LeftYAxis") != null; 
-1

To jeden pracuje -:

public static bool IsPropertyExists(dynamic dynamicObj, string property) 
     { 
      try 
      { 
       var value=dynamicObj[property].Value; 
       return true; 
      } 
      catch (RuntimeBinderException) 
      { 

       return false; 
      } 

     } 
1

to działa, jeśli obiekt dynamiczny jest json/format otwarty standard.

Zrobiłem dwa różne pomocniki metod jeden dla standardowego formatu i jeden dla "standardowego obiektu".

// Checks if object typed json or xml has a specific property 
    public static bool IsPropertyExistsOpenStandardFormat(dynamic dynamicObject, string propertyName) 
    { 
     try 
     { 
      var x = dynamicObject[propertyName]; 
      if (x != null) 
       return true; 
     } 
     catch 
     { 
      return false; 
     } 

    } 

    // Checks if standard object has a specific property 
    public static bool IsPropertyExistsStandard(dynamic dynamicObject, string propertyName) 
    { 
     return dynamicObject.GetType().GetProperty(propertyName) != null; 
    } 
Powiązane problemy