IList для EntityCollection с отражением - PullRequest
0 голосов
/ 17 мая 2011

В приложении, которое я пишу, я создаю интерфейс с помощью отражения от контекста данных. Отображение значений не является проблемой, но создание коллекций элементов и присвоение значений с помощью отражения не работает.

Вот код вопроса:

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 ]

1 голос
/ 17 мая 2011

Вместо того, чтобы готовить список и устанавливать его в коллекцию сущностей, вы можете вызвать функцию Add для свойства EntityCollection для каждого элемента?Вы можете использовать рефлексию для вызова метода, если вы не знаете, какой тип T для правильного приведения.

0 голосов
/ 18 мая 2011

R Кити получила правильный ответ, но возникла другая проблема, потому что нельзя просто установить свойство типа 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});
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...