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.
hiện tại là gì.GetType()? Đó có phải là loại bạn mong đợi không? –
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
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