Herman<T>.Instance Ответов: 1

Свойство подключенной службы должно вести к источнику данных


Всем привет,

У меня есть подключенные сервисы, и я использую свойства для извлечения данных из EF6.
В тестовом приложении я могу создать список с этими свойствами, чтобы заполнить combobox
ConnectedDataServices.DataServiceContext.GetType().GetRuntimeProperties().Select(x => x.Name).ToList();

Я могу получить vales из свойства he, но как объект типа вместо исходного типа ConcurrentBag<>.

Но как мне получить содержимое или значения объекта для привязки желаемого concurrentbag?

Что я уже пробовал:

var selectedProp = comboBox1.SelectedItem.ToString();

            PropertyInfo propInfo = _availableProps.FirstOrDefault(x => x.Name == selectedProp);
            var results = propInfo.GetValue(ConnectedDataServices.DataServiceContext, null);
            Type type = results.GetType();
            dataGridView1.DataSource = results;
            dataGridView1.Refresh();

результаты теперь являются типом объекта вместо ConcurrentBag<entity>

Richard Deeming

Тип времени компиляции result будет object; но тип времени выполнения будет любым типом, который возвращает свойство.

То DataSource собственность берет на себя object поэтому я изо всех сил пытаюсь понять , в чем проблема.

Herman&lt;T&gt;.Instance

Проблема заключалась в том, что я использовал ConcurrentBag в своем WCF. Переход к списку "объект" решил проблему. Я полагаю, что DataGridView не может отображать данные из объектов ConcurrentBAG<>.

Richard Deeming

Это звучит примерно так. Документация[^] говорит, что DataSource требуется объект, реализующий либо то, либо другое IList, IListSource, IBindingList, или IBindingListView. Но Коллекции concurrentbag[^] не реализует ни один из этих интерфейсов.

1 Ответов

Рейтинг:
8

Richard Deeming

Если вы используете последнюю версию компилятора C#, вы можете использовать сопоставление шаблонов switch чтобы убедиться, что значение свойства имеет правильный тип:

switch (results)
{
    case null:
    case IList _:
    case IListSource _:
    {
        // Includes IBindingList and IBindingListView
        dataGridView1.DataSource = results;
        break;
    }
    case ICollection collection:
    {
        dataGridView1.DataSource = new ArrayList(collection);
        break;
    }
    case IEnumerable sequence:
    {
        dataGridView1.DataSource = sequence.Cast<object>().ToList();
        break;
    }
    default:
    {
        // Not a supported type:
        dataGridView1.DataSource = null;
        break;
    }
}

Было бы достаточно просто преобразовать это для работы в более старом компиляторе, но это было бы не так чисто. :)