2012-06-05 4 views
5

У меня есть динамический объект, который выглядит следующим образом:Динамический объект. Как определить, определено ли свойство?

this.ChartDetails.Chart 

'Chart' является динамическим. Я хочу посмотреть, существует ли динамическое свойство на диаграмме с именем LeftYAxis. Каков наилучший способ сделать это на динамических объектах?

Я не думаю, что это дубликат How to detect if a property exists on an ExpandoObject?, потому что он не обсуждает лучший способ сделать это для динамических объектов.

+0

если this.ChartDetails.Chart.LeftYAxis! = NULL –

+0

Является ли это * ваш * реализация DynamicObject? – Tigran

+3

Возможный дубликат [как определить, существует ли свойство на динамическом объекте в C#?] (Http://stackoverflow.com/questions/2839598/how-to-detect-if-a-property-exists-on-a -dynamic-object-in-c) – jason

ответ

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

Это то, что происходит во время выполнения в первую очередь. (Когда вы получаете доступ к свойству «динамический» часть вещей происходит только тогда, когда первый шанс исключение получает обрабатывается переопределением объекта из DynamicObject «s TryGetMember и TrySetMember

некоторых объектов (например, ExpandoObject) на самом деле являются словарями под капотом и вы можете проверить их непосредственно следующим образом:

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

в принципе: не зная, что фактического типа ChartDetails.Chart является (если это ExpandoObject простого старина подкласс object или подкласс DynamicObject) нет никакого способа, кроме попробуйте/поймайте выше. Если вы написали код для ChartDetails и Chart или имеете доступ к исходному коду, вы можете определить, какие существуют методы для объекта, и использовать те, которые нужно проверить.

5

По целому ряду причин лучше избегать блоков try/catch для потока управления. Таким образом, в то время как метод Кристофера достигает желаемого результата, я считаю, это предпочтительнее:

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

Это один работает -:

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

       return false; 
      } 

     } 
1

Это работает, если динамический объект является JSON/открытый стандарт формата.

Я сделал два разных помощника метода один для открытого формата и один для «стандартного объекта».

// 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; 
    } 
Смежные вопросы