Что означает P в C# Expression?

Я пытаюсь использовать ответ в посте: Как вы сортируете EntitySet , чтобы предоставить интерфейс, чтобы я мог отсортировать EntitySet со списком привязок. Я создал класс ниже и получаю следующую ошибку компилятора: "Не удалось найти тип или пространство имен" P "(отсутствует директива using или ссылка на сборку?). Может кто-нибудь сказать мне, что означает P и какое пространство имен Мне нужно включить, чтобы получить метод ниже, чтобы скомпилировать? Я очень плохо знаком с делегатами и выражениями лямбы.

Кроме того, может ли кто-нибудь подтвердить, что если я создам BindingList из моего EntitySet, то любые изменения, которые я внесу в BindingList, будут сделаны в EntitySet?

По сути, у меня есть EntitySet, который мне нужно отсортировать и внести изменения. Затем мне нужно будет сохранить эти изменения, используя исходный объект, из которого получен BindingList.

public class EntitySetBindingWrapper<T> : BindingList<T>
{
    public EntitySetBindingWrapper(BindingList<T> root)
        : base(root)
    {
    }

            public void Sort<P>(Expression<Func<T, P>> expr, ListSortDirection direction)
    {
        if (expr == null)
            base.RemoveSortCore();

        MemberExpression propExpr = expr as MemberExpression;
        if (propExpr == null) throw new ArgumentException("You must provide a property", "expr");

        PropertyDescriptorCollection descriptorCol = TypeDescriptor.GetProperties(typeof(T));
        IEnumerable<PropertyDescriptor> descriptors = descriptorCol.Cast<PropertyDescriptor>();
        PropertyDescriptor descriptor = descriptors.First(pd => pd.Name == propExpr.Member.Name);

        base.ApplySortCore(descriptor, direction);
    }
}

Я наконец получил код выше для компиляции, но теперь я получаю сообщение об ошибке при попытке вызвать конструктор:

Следующий код, где currentPredefinedJob.fkItems является EntitySet, приводит к ошибке: Невозможно преобразовать из System.ComponentModel.IBindingList в System.ComponentModel.BindingList

var bindingWrapper = new EntitySetBindingWrapper<PredefinedJobsItem>(currentPredefinedJob.fkItems.GetNewBindingList());

И следующий код приводит к ошибке: Ошибка 8 Использование универсального типа 'MarineService.Tests.EntitySetBindingWrapper' требует аргументов типа '1'

var bindingWrapper = new EntitySetBindingWrapper(currentPredefinedJob.fkItems.GetNewBindingList());

Может кто-нибудь сказать мне, как мне нужно вызвать этот конструктор и подтвердить, как я буду сортировать полученный BindingList?

2 ответа

Решение

Вам необходимо указать универсальную переменную либо в определении класса, либо в определении метода.

P будет тип, возвращаемый вашей функцией expr

public void Sort<P>(Expression<Func<T, P>> expr, ListSortDirection direction)

Для вызова конструктора отлично работает следующее:

var w = new EntitySetBindingWrapper<String>(new System.ComponentModel.BindingList<string>());

Возможно ли проблема в том, что вы делаете внутри currentPredefinedJob.fkItems.GetNewBindingList()?

Другие вопросы по тегам