Доступ к элементам в IList с помощью отражения C # - PullRequest
0 голосов
/ 13 сентября 2010

У меня есть класс со свойством Items, представляющий собой IList:

class Stuff {
    IList<OtherStuff> Items;
}

Я хочу иметь возможность получить строку в методе (изначально я думал об этом формате: Items [0]) и получить первый элемент списка Items.

Я пробовал это:

object MyMethod(string s, object obj) {
    return obj.GetType().GetProperty(s).GetValue(obj,null);
}

с s, являющимся 'Items [0]', но это не работает ... Также попытался проанализировать параметр, чтобы получить доступ только к свойству 'Items' объекта и затем получить доступ к индексу (зная, что это IList) .

Ни один из этих подходов не сработал ... Есть мысли?

Есть мысли?

Ответы [ 4 ]

1 голос
/ 13 сентября 2010

Вы можете получить доступ к свойству и затем преобразовать его в список.

T GetListItem<T>(object obj, string property, int index)
{
    return (obj.GetType().GetProperty(property).GetValue(obj, null) as IList<T>)[index];
}

Рабочий пример для вашего примера кода:

OtherStuff item = GetListItem<OtherStuff>(obj, "Items", 0);
0 голосов
/ 19 сентября 2010

Предметы не были собственностью, поэтому мои подходы не сработали. Так и должно быть, поэтому я превратил его в свойство, и теперь оно работает гладко.

0 голосов
/ 13 сентября 2010

Вы должны попробовать это:

object GetFirstItemByReflection(object obj) {
    return obj.GetType().GetMethod("get_Item").Invoke(obj, new object[] { 0 } );
}

с соответствующими проверками.

«get_Item» - это «генерируемый» метод, используемый при доступе к элементам по индексу в коллекции.*

Когда вы получаете его MethodInfo, вы вызываете его в своей коллекции, передавая ему параметр «0», чтобы получить первый элемент.

0 голосов
/ 13 сентября 2010

Если вы хотите проверить объект на наличие числового индексатора независимо от того, является ли он IList, а затем вызвать индексатор с помощью отражения, вы можете попробовать этот метод.

Возвращает true, если объект имеет индексатор, и также заполняет value значением 0-го индекса.

public static bool TryGetFirstIndexWithReflection(object o, out object value)
{
    value = null;

    // find an indexer taking only an integer...
    var property = o.GetType().GetProperty("Item", new Type[] { typeof(int) });

    // if the property exists, retrieve the value...
    if (property != null)
    {
        value = property.GetValue(list, new object[] { 0 });
        return true;
    }

    return false;
}

Обратите внимание, что в этом примере не предпринимается попытка изящно обработать исключения, такие как IndexOutOfRangeException. Это зависит от вас, если вы сочтете это уместным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...