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