在我编写的应用程序中,我通过数据上下文的反射构建接口。显示值没有问题,但创建项集合并通过反射分配值不起作用。
以下是相关代码:
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>
。
答案 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});
}
}