РЕДАКТИРОВАТЬ: не важно. Комментатор прав, вы можете перейти прямо к IList. Я сосредоточил внимание на одном вопросе, который был сформулирован слишком сложно, чтобы увидеть очевидное, даже когда я кодировал ответ. DOH!
Хорошо, вам просто нужно копать немного глубже.
Базовым классом PersistentGenericBag является PersistentBag, который делает реализующим IList.
var prop1 = typeof (Customer).GetProperty("Invoice");
// if you need it for something...
var listElementType = prop1.PropertyType.GetGenericArguments()[0];
IList list1;
object obj = prop1.GetValue(object1, null);
if(obj is PersistentBag)
{
list1 = (PersistentBag)obj;
}
else
{
list1 = (IList)obj;
}
foreach (object item in list1)
{
// do whatever you wanted.
}
Проверено и работает для сумок. Примите это к логическому заключению для других типов списков / наборов / коллекций, с которыми вы можете столкнуться.
Итак, короткий ответ: Если вы ЗНАЕТЕ, что это сумка, вы можете просто привести объект сначала к PersistentBag, а затем к IList ...
IList list = (PersistentBag)obj;
Если вы НЕ ЗНАЕТЕ, тогда используйте условную логику, как показано.