我正在尝试使用用于列表视图的通用过滤器创建弹出窗口。我想使用参数“ T”来投射新对象。我在控件中有一个TextBox和一个ListView。我的“ BaseClass”具有多个类继承自的共享属性。在下面的示例中,类City,Company和Contact都从BaseClass继承。这些不同的类是作为T传递的类。我的VM声明为:
public class SearchViewModel<T> : BaseViewModel
where T : BaseClass, new()
{
...
}
我的ListView的Itemsource绑定到“ Items”
public ICollectionView Items { get; set; }
我的文本框绑定到“ SearchText”。目前,我将其设置如下:
private string _SearchText;
public string SearchText
{
get => _SearchText;
set
{
_SearchText = value;
OnPropertyChanged(nameof(SearchText));
if (string.IsNullOrEmpty(value))
Items.Filter = null;
else
{
var typedText = value.ToLower();
switch (typeof(T).Name)
{
case "City":
Items.Filter = new Predicate<object>(o => ((City)o).FilterByName.ToLower().Contains(typedText));
break;
case "Company":
Items.Filter = new Predicate<object>(o => ((Company)o).FilterByName.ToLower().Contains(typedText));
break;
case "Contact":
Items.Filter = new Predicate<object>(o => ((Contact)o).FilterByName.ToLower().Contains(typedText));
break;
}
}
}
}
我想做这样的事情:
private string _SearchText;
public string SearchText
{
get => _SearchText;
set
{
_SearchText = value;
OnPropertyChanged(nameof(SearchText));
if (string.IsNullOrEmpty(value))
Items.Filter = null;
else
{
Items.Filter = new Predicate<object>(o => ((T)o).FilterByName.ToLower().Contains(value.ToLower()));
}
}
}
这样做,编译器不会发出任何投诉。但是,在运行时出现以下错误:
System.NullReferenceException:'对象引用未设置为对象的实例。'
现在的问题是:有没有一种方法可以使用'T'将类转换为过滤器?
编辑:
更新:
1)对重复的响应:这不是有关Null引用的问题,而是如何将通用参数转换为类。
2)引发错误
Items.Filter = new Predicate<object>(o =>
((T)o).FilterByName
.ToLower()
.Contains(value.ToLower()))