Использование динамического метода C # для объекта - PullRequest
6 голосов
/ 14 июля 2011

У меня есть метод, который должен возвращать идентификаторы из списка. Обычно я использовал бы рефлексию для этой задачи (я не могу использовать универсальный метод, поскольку классы обычно являются 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);
}

работает.

Ответы [ 2 ]

1 голос
/ 18 июля 2011

C # чувствителен к регистру, в том числе при использовании динамического ключевого слова.ваш вызов int id = current.Id;, но вы говорите, что свойство является строчным идентификатором, и ваш вызов отражения выглядит без учета регистра.Ключевое слово dynamic не должно иметь проблем с вызовом общедоступных свойств экземпляра даже через границы сборки, поскольку оно говорит, что метод не найден, и я считаю, что вам нужно использовать int id = current.id;

1 голос
/ 14 июля 2011

Полагаю, вам может потребоваться определить тип возвращаемого значения "GetDataSource()" как "List<dynamic>".

Конечно, как указано в комментариях, для объектов должно быть определено свойство "id".

...