2011-07-14 42 views
6

Tôi có một phương thức sẽ trả về các id từ một Danh sách. Thông thường tôi sẽ sử dụng sự phản chiếu cho nhiệm vụ này (Tôi không thể sử dụng một phương thức chung vì các lớp thường là POCOS không chia sẻ một giao diện hoặc một lớp cơ sở và tôi không thể sửa đổi chúng). Tuy nhiên, tôi đã nghĩ về từ khóa dynamic mới và muốn thử điều này.Sử dụng phương pháp động C# cho một đối tượng

Tuy nhiên, vấn đề của tôi là dataSource [index] trả về một đối tượng. Vâng lúc chạy nó được đảm bảo rằng đối tượng isself là trên các lớp học của riêng tôi và có một tài sản id. Nhưng tôi cho rằng vì phương thức trả về một đối tượng, tôi nhận được một RumtineBinderException khi chạy trong khi truy cập current.id

public List<int> GetItemIds() 
{ 

    var result = new List<int>(); 
    var dataSource = GetDataSource(); // returns an List<Object> 

    for (int i = 0; i <= dataSource.Count - 1; i++) 
    { 
     dynamic current = dataSource[i]; 
     int id = current.Id; // throws RuntimeBinderException: Object has no definition for id 
    } 

    return result; 
} 

Có cách nào để đạt được những gì tôi muốn hay tôi phải quay trở lại để phản ánh để có được tài sản id ?

Cập nhật:

current.GetType() returns object 
current.GetType().GetProperties() returns a TargetInvocationException 

My Pocos sống trong dự án chính của tôi (VB.net) nhưng phương pháp này là trong một lớp học THƯ VIỆN, có lẽ đó là nguyên nhân. Tuy nhiên:

object current = dataSource[i]; 
PropertyInfo prop = current.GetType().GetProperty("id", BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); 
if (prop != null) 
{ 
    int id = (int)prop.GetValue(current, null); 
} 

hoạt động.

+0

hiện tại là gì.GetType()? Đó có phải là loại bạn mong đợi không? –

+0

Có gì đó sai ở đây .... sử dụng động trong ví dụ trên sẽ làm cho nó hoạt động nếu kiểu thời gian chạy có thuộc tính Id ... – Jeff

+0

Nó sẽ hoạt động - bạn có thể cập nhật bài đăng với thông tin cho current.GetType() hay không và current.GetType(). GetProperties()? – carlosfigueira

Trả lời

1

Tôi tin rằng bạn có thể cần phải xác định loại trả về "GetDataSource()" là "List<dynamic>".

Tất nhiên, như đã nêu trong nhận xét, các đối tượng phải xác định thuộc tính "id".

+0

Trong khi dự đoán của tôi là bạn sẽ không phá vỡ bất cứ điều gì bằng 'GetDataSource() như Danh sách 'vì nó biên dịch kỹ thuật vào Danh sách với kiểm tra kiểu, nó trông có vẻ xấu bởi vì Danh sách không phải là biến thể bởi vì bạn không thể làm tương tự cho ví dụ nếu List được trả về. Dù bằng cách nào nó không phải là giải pháp bởi vì bạn vẫn nói với trình biên dịch để xử lý đối tượng trả về của chỉ mục là động nên không có sự khác biệt. – jbtule

1

C# phân biệt chữ hoa chữ thường, bao gồm cả khi bạn sử dụng từ khóa động. cuộc gọi của bạn là int id = current.Id; nhưng bạn nói về thuộc tính là id chữ thường và cuộc gọi phản chiếu của bạn trông không phân biệt chữ hoa chữ thường. Từ khóa động sẽ không có vấn đề gì khi gọi các thuộc tính công khai ngay cả trên các ranh giới lắp ráp, vì nó nói rằng phương pháp này không được tìm thấy tốt nhất của tôi là bạn cần sử dụng int id = current.id;

+0

Trong ứng dụng thực tế của tôi, tài sản là chữ thường và tôi đã sử dụng ´current.id 'để truy cập nó. (nhưng tôi trộn nó lên trong mã ví dụ). Tuy nhiên, ngay cả khi tôi thấy thuộc tính trong cửa sổ xem, truy cập nó bằng mã lỗi. –

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