2014-10-15 19 views
5

Tôi có một đối tượng có tập hợp thuộc tính. Khi tôi nhận được thực thể cụ thể, tôi có thể thấy trường tôi đang tìm kiếm (opportunityid) và rằng thuộc tính ValueGuid cho cơ hội này. Đây là giá trị tôi muốn, nhưng nó sẽ không luôn luôn là một cơ hội, và do đó tôi không thể luôn luôn nhìn vào opportunityid, vì vậy tôi cần phải nhận được các lĩnh vực dựa trên đầu vào được cung cấp bởi người sử dụng.Làm cách nào để bạn nhận được Giá trị của một thuộc tính từ PropertyInfo?

Mã của tôi cho đến nay là:

Guid attrGuid = new Guid(); 

BusinessEntityCollection members = CrmWebService.RetrieveMultiple(query); 

if (members.BusinessEntities.Length > 0) 
{ 
    try 
    { 
     dynamic attr = members.BusinessEntities[0]; 
     //Get collection of opportunity properties 
     System.Reflection.PropertyInfo[] Props = attr.GetType().GetProperties(); 
     System.Reflection.PropertyInfo info = Props.FirstOrDefault(x => x.Name == GuidAttributeName); 
     attrGuid = info.PropertyType.GUID; //doesn't work. 
    } 
    catch (Exception ex) 
    { 
     throw new Exception("An error occurred when retrieving the value for " + attributeName + ". Error: " + ex.Message); 
    } 
} 

Các động attr chứa lĩnh vực tôi đang tìm kiếm (trong trường hợp này opportunityid), do đó có chứa một lĩnh vực giá trị, đó là đúng Guid. Tuy nhiên, khi tôi nhận được thông tin PropertyInfo (opportunityid), nó không còn thuộc tính Value nữa. Tôi đã thử nhìn vào PropertyType.GUID nhưng điều này không trả về đúng Guid. Làm thế nào tôi có thể nhận được giá trị cho tài sản này?

Trả lời

7

Trừ khi tài sản là static, không đủ để có được đối tượng PropertyInfo để nhận giá trị của một thuộc tính. Khi bạn viết "đồng bằng" C# và bạn cần phải nhận được một giá trị của một số tài sản, nói rằng, MyProperty, bạn viết này:

var val = obj.MyProperty; 

Bạn cung cấp hai điều - tên tài sản (tức là những gì để có được) và các đối tượng (tức là từ đâu để lấy nó).

PropertyInfo đại diện cho "cái gì". Bạn cần phải xác định "từ đâu" một cách riêng biệt. Khi bạn gọi

var val = info.GetValue(obj); 

bạn vượt qua "từ đâu" vào PropertyInfo, để cho nó trích xuất các giá trị của tài sản từ đối tượng cho bạn.

Lưu ý: trước khi .NET 4.5 bạn cần phải vượt qua null như một cuộc tranh luận thứ hai:

var val = info.GetValue(obj, null); 
+0

Giải thích tuyệt vời! GetValue() có tham số thứ 2 phải là null. – helb

+0

Âm thanh như những gì tôi cần. Chỉ cần kiểm tra nó để chắc chắn rằng tôi hiểu. – sr28

+0

Hmmm, tôi chắc chắn phương pháp này sẽ hoạt động nếu tôi hiểu nó. Tuy nhiên, tôi nhận được một ngoại lệ nói rằng nó không thể chuyển đổi CRMWebService.Key để System.Guid. Tôi đã thực hiện về cơ bản attrGuid = (Guid) info.GetValue (attr, null); – sr28

2

Sử dụng PropertyInfo.GetValue(). Giả sử tài sản của bạn đã loại Guid? thì đây nên làm việc:

attrGuid = ((System.Guid?)info.GetValue(attr, null)).Value; 

Lưu ý rằng một ngoại lệ sẽ được ném ra nếu giá trị tài sản là null.

2

thử với:

attrGuid = (Guid)info.GetValue(attr,null) 
3

Nếu tên của tài sản đang thay đổi, bạn nên sử dụng GetValue:

info.GetValue(attr, null); 

Thuộc tính cuối cùng của phương pháp đó có thể null, vì nó là chỉ số giá trị và chỉ cần thiết khi truy cập các mảng, chẳng hạn như Value[1,2].

Nếu bạn biết tên của thuộc tính trên trước, bạn có thể sử dụng dynamic hành vi của nó: bạn có thể gọi bất động sản mà không cần phải làm phản ánh bản thân:

var x = attr.Guid; 
+0

có này không cho tôi Guid của attr?Trong ví dụ của tôi attr đại diện cho một thực thể, mà lần lượt có các propertyid tài sản, mà lần lượt có một giá trị (guid), vì vậy tôi không cần phải có được tài sản được gọi là opportid đầu tiên? – sr28

+0

Bạn có thể gõ đằng sau nó bất cứ điều gì bạn muốn, miễn là nó là một tài sản hiện có, vì nó là JIT'ed anyway. –

+0

Vui lòng giải thích lý do tại sao điều này sẽ hoạt động – helb

Các vấn đề liên quan