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>

IList to EntityCollection with reflection

是否可以对每个项调用 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});
    }
}