Tôi có một cá thể thực hiện IDictionary<T, K>
, tôi không biết T và K ở thời gian cộng tác và muốn nhận tất cả các phần tử từ đó. Tôi không muốn sử dụng IEnumerable
vì một số lý do, đó sẽ là giao diện không chung chung duy nhất được triển khai bởi IDictionary
.Lấy các giá trị của một IDictionary chung bằng cách sử dụng sự phản chiếu
Mã tôi có cho đến nay:
// getting types
Type iDictType = instance.GetType().GetInterface("IDictionary`2");
Type keyType = iDictType.GetGenericArguments()[0];
Type valueType = iDictType.GetGenericArguments()[1];
// getting the keys
IEnumerable keys = (IEnumerable)dictType.GetProperty("Keys")
.GetValue(instance, null);
foreach (object key in keys)
{
// ==> this does not work: calling the [] operator
object value = dictType.GetProperty("Item")
.GetValue(instance, new object[] {key });
// getting the value from another instance with TryGet
MethodInfo tryGetValue = iDictType.GetMethod("TryGetValue");
object[] arguments = new object[] { key, null };
bool hasElement = (bool)tryGetValue.Invoke(otherInstance, arguments);
object anotherValue = arguments[1];
}
tôi cũng có thể gọi TryGetValue, nhưng tôi nghĩ chúng ta có thể gọi toán tử []. Ai có thể giúp tôi?
Tôi không chắc chắn rằng tôi hiểu câu hỏi. Bạn có muốn sử dụng toán tử [] thay vì nhận giá trị của thuộc tính Item thông qua Reflection không? – Andy
Đã thử điều này với từ điển và cố gắng sử dụng trình lập chỉ mục/get_Item hoạt động cho tôi. –
Gishu
@Andy: Toán tử [] thực sự gọi một thuộc tính Item ở thời gian chạy, không hiển thị tại thời gian biên dịch. @Gishu: bạn gọi cho trình chỉ mục như thế nào? Không có thuộc tính 'Item', chỉ có phương thức 'get_Item'? –