IList to EntityCollection with reflection
本文关键字:reflection with EntityCollection to IList | 更新日期: 2023-09-27 17:56:48
在我编写的应用程序中,我通过数据上下文的反射来构建接口。显示值没有问题,但创建项目集合并通过反射分配值不起作用。
这是有问题的代码:
var listItemType = property.PropertyType.GetGenericArguments().First();
// See remark #1
var listType = typeof(List<>).MakeGenericType(new[] { listItemType });
var assocItems = Activator.CreateInstance(listType) as IList;
var listSelector = EditorPanel.FindControl(property.Name) as PropertyListBox;
if (listSelector != null)
{
foreach (var selectedItem in listSelector.SelectedItems)
{
assocItems.Add(selectedListItem);
}
}
// See remark #2
property.SetValue(itemToUpdate, assocItems, null);
备注#1:
我尝试将行更改为var listType = typeof(EntityCollection<>).MakeGenericType(new[] {listItemType});
,然后将assocItems
转换为IListSource。我没有打电话给assocItems.GetList().Add()
assocItems.Add()
,但这导致了一个InvalidOperationException
:
无法将对象添加到 实体集合或实体引用。 附加到 无法将 ObjectContext 添加到 实体集合或实体引用 与源无关 对象。
备注#2:
在这里,我需要以某种方式将IList
转换为EntityCollection<T>
。
是否可以对每个项调用 EntityCollection 属性上的 Add 函数,而不是准备列表并将其设置为实体集合?如果您不知道正确转换的 T 类型是什么,则可以使用反射来调用该方法。
R Kitty 有正确的答案,但出现了另一个问题,因为不能只设置类型 EntityCollection
的属性。这是任何尝试做同样事情的人的完整技巧:
var listItemType = property.PropertyType.GetGenericArguments().First();
var clearMethod = property.PropertyType.GetMethod("Clear");
var addMethod = property.PropertyType.GetMethod("Add");
var listSelector = EditorPanel.FindControl(property.Name) as PropertyListBox;
if (listSelector != null)
{
clearMethod.Invoke(property.GetValue(itemToUpdate, null), null);
foreach (var selectedItem in listSelector.SelectedItems)
{
addMethod.Invoke(property.GetValue(itemToUpdate, null), new[] {selectedItem});
}
}