Tôi muốn tự động khám phá một số thông tin về một lớp được cung cấp để thực hiện điều gì đó giống như việc nhập biểu mẫu. Cụ thể là tôi đang sử dụng sự phản chiếu để trả về giá trị PropertyInfo cho mỗi thuộc tính. Tôi có thể đọc hoặc viết giá trị cho mỗi thuộc tính từ "biểu mẫu" của tôi, nhưng nếu thuộc tính được định nghĩa là "int", tôi sẽ không thể, và chương trình của tôi thậm chí không nên thử, để viết một giá trị null.Xác định xem thuộc tính phản ánh có thể được gán không
Làm cách nào tôi có thể sử dụng sự phản chiếu để xác định xem một thuộc tính nhất định có thể được gán giá trị rỗng không, không viết câu lệnh chuyển đổi để kiểm tra mọi loại có thể không? Đặc biệt, tôi muốn phát hiện sự khác biệt giữa các loại được đóng hộp như "int" so với "int?", Vì trong trường hợp thứ hai, tôi làm muốn có thể ghi giá trị null. IsValueType và IsByRef dường như không thấy sự khác biệt.
public class MyClass
{
// Should tell me I cannot assign a null
public int Age {get; set;}
public DateTime BirthDate {get; set;}
public MyStateEnum State {get; set;}
public MyCCStruct CreditCard {get; set;}
// Should tell me I can assign a null
public DateTime? DateOfDeath {get; set;}
public MyFamilyClass Famly {get; set;}
}
Lưu ý rằng tôi cần phải xác định thông tin này trước khi tôi thực sự cố gắng ghi giá trị, vì vậy sử dụng xử lý ngoại lệ được bao quanh SetValue không phải là một tùy chọn.
Một cái gì đó tôi đã không nghĩ về nhưng tôi đã kiểm tra câu trả lời của bạn chống lại là mảng, chẳng hạn như int [] (có thể được gán null). Câu trả lời của bạn cũng đúng cho trường hợp này. – David
Mảng là kiểu tham chiếu, vì vậy chúng hoạt động giống như các lớp. –
Tôi nghĩ rằng cần lưu ý rằng trong OP, có những ví dụ sử dụng một int? và DateTime ?, do đó, kiểm tra đầu tiên sẽ trả về true (! type.IsValueType). Tôi làm như thế này tốt hơn so với một trong MSDN, nhưng tò mò tại sao bạn thêm vào những gì có vẻ là một kiểm tra dự phòng. Có lẽ, bởi vì bạn muốn đối phó với tất cả các trường hợp ngoài những gì được yêu cầu? – pqsk