用反射IList到EntityCollection

时间:2011-05-17 16:00:25

标签: c# .net entity-framework reflection entity-framework-4

在我编写的应用程序中,我通过数据上下文的反射构建接口。显示值没有问题,但创建项集合并通过反射分配值不起作用。

以下是相关代码:

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.Add()我调用了assocItems.GetList().Add(),而是导致了InvalidOperationException

  

无法将对象添加到   EntityCollection或EntityReference。   附加到的对象   无法将ObjectContext添加到   EntityCollection或EntityReference   与源无关   宾语。

备注#2:

我需要以某种方式将IList转换为EntityCollection<T>

2 个答案:

答案 0 :(得分:1)

您可以使用每个项目调用EntityCollection属性上的Add函数,而不是准备列表并将其设置为实体集合吗?如果你不知道T的类型是适当的强制转换,你可以使用反射来调用该方法。

答案 1 :(得分:0)

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});
    }
}