c# - 使用通用类类型参数进行强制转换
问题描述
我正在尝试为列表视图创建带有通用过滤器的弹出窗口。我想使用参数'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) 对 Duplicate 的回应:这不是关于 Null 引用的问题,而是如何将泛型参数转换为类。
2)错误被抛出
Items.Filter = new Predicate<object>(o =>
((T)o).FilterByName
.ToLower()
.Contains(value.ToLower()))
解决方案
推荐阅读
- python - 即使“要求已经满足”,也找不到 gtts 模块
- c# - 无法加载文件或程序集 Microsoft.Build.Utilities.Core。为什么 DotNetCompilerPlatform 依赖于旧的 Build.Utilities.Core?
- python - 嵌套字典的问题
- javascript - 转置 JSON 对象
- reactjs - CRUD操作后如何更新React js中的Material表?
- shell - 如何使用 Jenkins 主动选择参数 groovy 脚本在远程服务器中执行 shell 脚本?
- javascript - 使用递归的边界填充像素到像素不起作用?
- r - 线性模型的字符串公式
- python - 如何调整seaborn中的x轴以正确显示日期?
- python - 在DataFrame中找到具有行空间范围的每一列的最大值