2013-08-12 41 views
9

xem xét mã này:SetValue trong phản ánh trong C#

var future = new Future(); 
future.GetType().GetProperty(info.Name).SetValue(future, converted); 

Trong đoạn mã trên, chúng tôi phải vượt qua hai đối số cho SetValue. Đầu tiên, đối tượng mà chúng ta muốn thiết lập thuộc tính của nó. Thứ hai, giá trị mới. Nhưng chúng tôi chọn thuộc tính cụ thể.

Tại sao chúng ta phải chuyển tham số đầu tiên để đặt giá trị khi chúng tôi đã đặt đối tượng tương lai trước đó !?

+2

Phản ánh sẽ phức tạp hơn nếu mọi đối tượng phải nhớ * cách nó thu được, chỉ để nó có thể sử dụng thông tin được giữ lại sau đó thay vì yêu cầu lại thông qua tham số. I E. có nhiều cách để có được một 'Loại', không phải tất cả đều yêu cầu một thể hiện kiểu đó trước. –

Trả lời

18

Vì đối tượng tương lai là một ví dụ. PropertyInfo được truy xuất từ ​​loại (Type type = future.GetType();) và không bị ràng buộc với bất kỳ trường hợp nào. Đó là lý do tại sao bạn phải chuyển thể hiện trong SetValue().

Vì vậy:

var future = new Future(); 

var propertyName = "..."; 
Type type = future.GetType(); 
PropertyInfo propertyInfo = type.GetProperty(propertyName); 

propertyInfo.SetValue(future, value); 

Bạn có thể tái sử dụng các PropertyInfo để thiết lập thuộc tính của các trường hợp khác.

4

Bạn chưa đặt đối tượng trong tương lai trước đây - bạn chỉ cần trích xuất loại của nó và sau đó thao tác trên đó. Những gì bạn kết thúc với một đối tượng PropertyInfo đề cập đến thuộc tính đó trên bất kỳ phiên bản nào của loại Future.

5

Đây

future.GetType() 

future chỉ được sử dụng để có được kiểu của nó. Có hiệu quả giống như

Type t = future.GetType(); 
t.GetProperty(info.Name).SetValue(future, converted); 

Trên dòng thứ hai của mã trên tất cả kiến ​​thức về đối tượng đã sử dụng để loại bị mất và chúng tôi đang xử lý loại đó. Sau đó, khi chúng tôi có thông tin về thuộc tính của loại, chúng tôi cần biết đối tượng nào cần được sử dụng, vì vậy chúng tôi đang cung cấp future một lần nữa.

1

Bạn có thể dễ dàng làm điều sau đây:

typeof(Future).GetProperty(info.Name).SetValue(future, converted); 

Làm thế nào trường hợp có thể được thực hiện mà không cần future tham số?

1

Hãy xem xét những 2 lớp:

class Future 
{ 
    public int MyProperty { get; set; } 
} 
class FarFuture : Future { } 

Hãy nhìn vào mã này:

var future = new Future(); 
var farFuture = new FarFuture(); 
future.GetType().GetProperty(info.Name).SetValue(farFuture, converted); 

Các PropertyInfo không gắn kết với một thể hiện, nhưng để một kiểu.

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