Tôi đang cố truy cập một đối tượng được lưu trữ trong từ điển kiểu String, UnknownClass. Tôi có chìa khóa, và biết giá trị là một trong một số lớp container. Vì giá trị được chuyển đến một phương thức nhận một đối tượng, tôi không cần biết loại của lớp được lưu trữ như một giá trị. Tôi cũng cần gọi ContainsKey để xác nhận khóa tồn tại.Lấy giá trị từ điển bằng cách sử dụng Reflection
Tôi đã thử các phương pháp sau đây không có thành công:
Dictionary<String, object> list = (Dictionary<String, object>)source.GetType().GetProperty(dictionaryName).GetValue(source, null);
nextSource = list[key];
nào mang lại cho tôi một lỗi đúc, và:
nextSource = source.GetType().GetMethod("get_Item").Invoke(source, new object[] { key });
nào mang lại cho tôi một ngoại lệ tham khảo null.
Dưới đây là một chút về mã, mặc dù tôi không chắc chắn nó sẽ giúp ích nhiều.
private void SetValue(object source, String path, String value)
{
if (path.Contains('.'))
{
// If this is not the ending Property, continue recursing
int index = path.IndexOf('.');
String property = path.Substring(0, index);
object nextSource;
if(property.Contains("*"))
{
path = path.Substring(index + 1);
index = path.IndexOf('.');
String dictionaryName = path.Substring(0, index);
Dictionary<String, object> list = (Dictionary<String, object>)source.GetType().GetProperty(dictionaryName).GetValue(source, null);
nextSource = list[property.Substring(1)];
//property = property.Substring(1);
//nextSource = source.GetType().GetMethod("Item").Invoke(source, new[] { property });
} ...
Từ điển được truy cập được định nghĩa trong lớp PersonObject như vậy:
public class PersonObject
{
public String Name { get; set; }
public AddressObject Address { get; set; }
public Dictionary<String, HobbyObject> Hobbies { get; set; }
Giá trị của Path, ở giai đoạn này, được thiết lập để "*Hiking.Hobbies.Hobby"
. Về cơ bản, chuỗi đường dẫn cho phép tôi điều hướng đến một thuộc tính trong một lớp con và tôi cần từ điển để truy cập các thuộc tính cho một danh sách của cùng một lớp.
Các bạn đã xác nhận rằng 'source.GetType() GetProperty (dictionaryName) .GetValue (nguồn, null) 'là trở về tham chiếu đến từ điển hoặc là nó trở về' null'? EDIT: nếu nó được trả lại từ điển đúng cách, có thể chỉ cần sử dụng 'dynamic' thay vào đó:' dynamic list = (dynamic) source.GetType(). GetProperty (dictionaryName) .GetValue (source, null); nextSource = (đối tượng) danh sách [key]; ' –
am damn chắc chắn nguồn là null nếu không điều này nên làm việc –
Nguồn không phải là null. Khi tôi gọi điều này, tôi nhận được một InvalidCastException. Từ điển thực mà tôi đang truy cập cho ví dụ cụ thể này là kiểu. –
Tim