【问题标题】:Custom class in C# combo box, Linq dynamic cast to string crashesC# 组合框中的自定义类,Linq 动态转换为字符串崩溃
【发布时间】:2019-03-01 19:01:31
【问题描述】:

我编写了一个通用类,它存储在组合框项目列表中,使用数据库标识符的键/值及其字符串标签值。通过这种方式选择一个索引,我得到它的数据库主键和一个用于视觉目的的字符串标签。问题是,我正在覆盖组合框以使用子字符串进行增强的建议/追加搜索,而不仅仅是像 C#/.NET 中的默认组合框那样搜索“StartsWith”。

问题在于使用 linq(ComboBox 组件的子类):

private Expression<Func<ObjectCollection, IEnumerable<string>>> _propertySelector

_suggBindingList.Clear();
_suggBindingList.RaiseListChangedEvents = false;
_propertySelectorCompiled(Items) //Items is ObjectCollection <-- crashes
    .Where(_filterRuleCompiled)
    .OrderBy(_suggestListOrderRuleCompiled)
    .ToList()
    .ForEach(_suggBindingList.Add);
_suggBindingList.RaiseListChangedEvents = true;
_suggBindingList.ResetBindings();

简单的解决方案是手动循环遍历项目并手动转换/转换,但我希望有一种更简单的方法可以让我的组合框 DataItem 自定义类在运行时转换为字符串......所以上面的代码可以在我添加的常规组合框数据或键/值对自定义类组合框项目上正常工作。该类的 ToString() 仅使用标签将自身表示为字符串,我认为这会涵盖这一点,但是我猜不是。

有什么建议吗?

【问题讨论】:

  • 此外,通过将静态方法添加到特定类但不确定对于像字符串这样的原始类型,在类和对象之间进行显式转换是有意义的。

标签: c# .net winforms combobox


【解决方案1】:

不幸的是,我找不到一个简单的通用方法 w/linq,所以我只是编写了相应的依赖 .ToString() 的代码,因此我们以字符串格式表示对象(甚至是我的自定义对象)并进行操作相应地。所以我做了一个通用的方法,只是删除了 linq,因为它会在我的自定义类上崩溃并且似乎不会调用 ToString() 覆盖,只是运行时强制转换并失败。

哦,好吧,仍然是一个干净的通用解决方案,但使用 linq 很好。不幸的是,linq 现在已经不在解决方案中了。

【讨论】:

    猜你喜欢
    • 2019-03-06
    • 2013-03-25
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多