Что означает P в C# Expression?
Я пытаюсь использовать ответ в посте: Как вы сортируете EntitySet
Кроме того, может ли кто-нибудь подтвердить, что если я создам 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()
?