2012-06-05 22 views
5

Tengo un objeto dinámico que se ve de la siguiente manera:Objeto dinámico: cómo saber si una propiedad está definida?

this.ChartDetails.Chart 

'Gráfico' es dinámica. Quiero ver si existe una propiedad dinámica en el Gráfico llamado LeftYAxis. ¿Cuál es la mejor manera de hacer esto en objetos dinámicos?

No creo que este es un duplicado de How to detect if a property exists on an ExpandoObject? porque no discute el mejor método para hacer esto para objetos dinámicos.

+0

si this.ChartDetails.Chart.LeftYAxis! = Null –

+0

¿Este es su aplicación * * de DynamicObject? – Tigran

+3

posible duplicado de [cómo detectar si una propiedad existe en un objeto dinámico en C#?] (Http://stackoverflow.com/questions/2839598/how-to-detect-if-a-property-exists-on-a -dynamic-object-in-c) – jason

Respuesta

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

Esto es lo que ocurre en tiempo de ejecución en primer lugar. (Al acceder a una propiedad de la pieza 'dinámica' de las cosas sólo ocurre cuando una excepción de primera oportunidad se maneja por anulación del objeto de TryGetMember y TrySetMember

Algunos objetos DynamicObject 's (como ExpandoObject) son en realidad los diccionarios bajo el capó y se puede comprobar directamente la siguiente manera:

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

Básicamente: sin saber de qué real tipo ChartDetails.Chart es (si es un ExpandoObject un ol llano' subclase de object o una subclase de DynamicObject) no hay manera, además de la intenta/atrapa arriba. Si escribió el código para ChartDetails y Chart o tiene acceso al código fuente, puede determinar qué métodos existen para el objeto y usarlos para verificar.

5

Por diversas razones, es mejor evitar los bloques try/catch para controlar el flujo. Por lo tanto, mientras que el método de Christopher alcanza el resultado deseado, Me parece preferible:

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

Ésta está trabajando -:

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

       return false; 
      } 

     } 
1

Esto funciona si el objeto dinámico es un/formato de estándar abierto JSON.

Hice dos métodos diferentes de ayuda uno para el formato estándar abierto y uno para "objeto estándar".

// 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; 
    } 
Cuestiones relacionadas