2012-06-05 70 views
5

Tôi có một đối tượng động trông như sau:Đối tượng động - Cách xác định xem thuộc tính có được xác định không?

this.ChartDetails.Chart 

'Chart' là năng động. Tôi muốn xem liệu thuộc tính động có tồn tại trên Biểu đồ có tên là LeftYAxis hay không. Cách tốt nhất để làm điều này trên các đối tượng động là gì?

Tôi không cho rằng đây là bản sao của How to detect if a property exists on an ExpandoObject? vì nó không thảo luận phương pháp tốt nhất để làm điều này cho các đối tượng động.

+0

nếu this.ChartDetails.Chart.LeftYAxis! = Null –

+0

Đây có phải là * của bạn * triển khai DynamicObject không? – Tigran

+3

có thể trùng lặp của [làm thế nào để phát hiện nếu một tài sản tồn tại trên một đối tượng năng động trong C#?] (Http://stackoverflow.com/questions/2839598/how-to-detect-if-a-property-exists-on-a -namnamic-object-in-c) – jason

Trả lời

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

Đây là những gì xảy ra khi chạy lúc đầu. (Khi bạn truy cập vào một tài sản mảnh 'động' của những thứ chỉ xảy ra khi một ngoại lệ đầu tiên có cơ hội được xử lý bởi ghi đè của đối tượng của DynamicObject 's TryGetMemberTrySetMember

Một số đối tượng (như ExpandoObject) là thực sự từ điển dưới mui xe và bạn có thể kiểm tra trực tiếp như sau:

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

về cơ bản: không biết những gì thực tế loại ChartDetails.Chart là (nếu nó là một ExpandoObject một ol đồng bằng' lớp con của object hoặc một lớp con của DynamicObject) không có cách nào bên cạnh thử/nắm bắt ở trên. Nếu bạn đã viết mã cho ChartDetailsChart hoặc có quyền truy cập vào mã nguồn, bạn có thể xác định phương thức nào tồn tại cho đối tượng và sử dụng các phương thức đó để kiểm tra.

5

Vì nhiều lý do, tốt nhất nên tránh các khối thử/nắm bắt để kiểm soát luồng. Vì vậy, trong khi phương pháp Christopher đạt kết quả mong muốn, tôi tìm thấy điều này thích hợp hơn:

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

Cái này đang làm việc -:

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

       return false; 
      } 

     } 
1

này Làm việc nếu đối tượng năng động là một định dạng json/chuẩn mở.

Tôi đã tạo hai trình trợ giúp phương thức khác nhau cho định dạng chuẩn mở và một cho "đối tượng chuẩn".

// 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; 
    } 
Các vấn đề liên quan