使用通用类类型参数进行强制转换

时间:2018-08-31 15:44:35

标签: c# class generics casting

我正在尝试使用用于列表视图的通用过滤器创建弹出窗口。我想使用参数“ 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的建议添加调试结果照片 DebugREsult

更新

1)对重复的响应:这不是有关Null引用的问题,而是如何将通用参数转换为类。

2)引发错误

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

0 个答案:

没有答案