Использование динамического метода C # для объекта

У меня есть метод, который должен возвращать идентификаторы из списка. Обычно я бы использовал отражение для этой задачи (я не могу использовать универсальный метод, поскольку классы обычно являются POCOS, которые не разделяют интерфейс или базовый класс, и я не могу их изменять). Однако я подумал о новом ключевом слове dynamic и хотел попробовать это.

Однако моя проблема в том, что dataSource [index] возвращает объект. Во время выполнения гарантируется, что сам объект входит в мои классы и имеет свойство id. Но я полагаю, поскольку метод возвращает объект, я получаю исключение RumtineBinderException во время выполнения при доступе к current.id

public List<int> GetItemIds()
{

    var result = new List<int>();
    var dataSource = GetDataSource(); // returns an List<Object>

    for (int i = 0; i <= dataSource.Count - 1; i++)
    {
        dynamic current = dataSource[i];
        int id = current.Id;  // throws RuntimeBinderException: Object has no definition for id
    }

    return result;
}

Есть ли способ добиться того, что я хочу, или мне нужно вернуться к отражению, чтобы получить свойство id ?

Обновление:

current.GetType() returns object
current.GetType().GetProperties() returns a TargetInvocationException

Мои Pocos живут в моем основном проекте (VB.net), но этот метод находится в библиотеке классов, возможно, это причина. Однако:

object current = dataSource[i];
PropertyInfo prop = current.GetType().GetProperty("id", BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
if (prop != null)
{
    int id = (int)prop.GetValue(current, null);
}

работает.

6
задан Jürgen Steinblock 15 July 2011 в 06:46
поделиться