首页 > 解决方案 > 使用通用类类型参数进行强制转换

问题描述

我正在尝试为列表视图创建带有通用过滤器的弹出窗口。我想使用参数'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”为过滤器转换类?

编辑

根据 Dave 的建议添加调试结果的照片 调试结果

更新

1) 对 Duplicate 的回应:这不是关于 Null 引用的问题,而是如何将泛型参数转换为类。

2)错误被抛出

Items.Filter = new Predicate<object>(o => 
  ((T)o).FilterByName
        .ToLower()
        .Contains(value.ToLower()))

标签: c#classgenericscasting

解决方案


推荐阅读