Странно, что вы упаковываете столько разнородной информации в массив .Массивы обычно используются для хранения элементов типа того же .Почему бы не инкапсулировать данные в правильном типе?
Но чтобы ответить на вопрос в соответствии с заданным вопросом - в C # 4 вы можете использовать dynamic
:
var target = ((dynamic)vals[2]).Target;
if(target != null)
{
object oo = Enumerable.ElementAt(target, vals[4]);
//Do something with oo...
}
(РЕДАКТИРОВАТЬ: если вы хотитечтобы минимизировать использование dynamic
здесь, приведите к WeakReference
и оставьте динамический вызов до конца. Таким образом, безопасность типов «максимизируется».)
В противном случае вы можете использовать отражение:
object target = ((WeakReference)vals[2]).Target;
if (target != null)
{
object oo = target.GetType()
.GetProperty("Item")
.GetValue(target, new[] { vals[4] });
//Do something with oo...
}
(РЕДАКТИРОВАТЬ: Если индексатор может быть явно реализован, вам, вероятно, потребуется использовать сопоставления интерфейса.)