2010-10-20 76 views
5

Tôi có một số phương thức truy cập dữ liệu chấp nhận tham số đối tượng động (tức là, foo động). Tôi không thể sử dụng giao diện để xác định để nhập thông số đầu vào do mã hiện có. Tôi đang thiết lập các thuộc tính trong các phương thức truy cập dữ liệu, nhưng sử dụng động mà không kiểm tra xem các thuộc tính/phương thức tồn tại có làm cho tôi lo lắng hay không.Reflection là cách tốt nhất để xác định presense/vắng mặt của tài sản/phương pháp trên một đối tượng năng động?

Vì vậy, tôi đang tìm cách kiểm tra thuộc tính/phương pháp thời gian chạy của đối tượng động, nhưng tôi không muốn sử dụng phản chiếu do tác động hiệu suất. Có cách nào khác/được đề nghị để truy vấn các thuộc tính/phương thức của một đối tượng động không?

Xin cảm ơn, Erick

+0

Bạn không muốn sử dụng sự phản chiếu vì tác động hiệu suất, nhưng rất vui khi sử dụng * động *? –

+0

@Kirk: Năng động thực sự hoạt động rất tốt. Nó nhanh hơn một chút so với sự phản chiếu để truy cập các thành viên ... –

+1

Bạn * nghĩ * chúng sẽ là tác động hiệu suất hoặc bạn * biết *? Quyết định thiết kế được thực hiện tốt hơn trên thực tế. – smirkingman

Trả lời

2

Phản ánh không thực sự hoạt động (theo cách bạn mong đợi) trên dynamic loại. Bạn cần kiểm tra IDynamicMetaObjectProvider, sau đó sử dụng các phương pháp của nó để xác định liệu một thành viên có sẵn trên loại đó không.

Sự cố là hoàn toàn chấp nhận được đối với loại dynamic để thêm thành viên mới khi chạy. Ví dụ: xem ExpandoObject. Nó chỉ cho biết thêm các thành viên mới vào hoạt động thiết lập, nhưng bạn có thể, chỉ cần một cách dễ dàng, tạo ra một loại năng động luôn luôn trả về một thành viên hợp lệ, không có vấn đề gì được truyền vào nó, ví dụ:

dynamic myType = new DynamicFoo(); 
Console.WriteLine(myType.Foo); 
Console.WriteLine(myType.Bar); 
Console.WriteLine(myType.Baz); 

này có thể được thực hiện bằng cách ghi đè accessor và chỉ làm cho chúng luôn hợp lệ. Trong trường hợp này, sự phản chiếu sẽ không có cách nào để nói điều gì sẽ hoạt động ở đây ...

+0

Reed, đây là câu trả lời mà tôi cần nhưng tôi quyết định sử dụng phương pháp thử nó và để cho ngoại lệ bị ném. Cảm ơn! –

2

Tôi sẽ xem vấn đề này hơi khác một chút. Nếu bạn đang sử dụng các đối tượng có dynamic thì có thể truy cập các thuộc tính thông qua phản chiếu không liên quan hay không. Nó chỉ quan trọng nếu họ có thể truy cập thông qua dynamic. Vì vậy, tại sao không chỉ sử dụng các thuộc tính và bắt các execption đó sẽ là kết quả từ abscence của họ?

+0

+1 từ tôi - đây sẽ là cách tiếp cận của tôi. Chỉ cần sử dụng đối tượng và xử lý các ngoại lệ như/nếu chúng đến. –

+0

@Reed, chúc mừng 100K! – JaredPar

+0

Cảm ơn! Chỉ cần thông qua nó sáng nay: D –