3

这个问题是针对对象数据源提出的。所以考虑一下我有一堂课

public class Customer{

    public String name;
    public int age;

    public Customer(String name, int age) {
         this.name = name;
         this.age = age;
    }
}

我已经将一个列表框数据绑定到这些对象的列表中。所以我说

listBox.DisplayMember = "name";

但我的问题是,当我将 Customer 类的名称重构为

public String fullName;

DisplayMember 仍然停留在“名称”。这将失败。所以它降低了我重构域对象的能力。有什么办法吗?

4

7 回答 7

5

这是一个更性感、更灵活的解决方案

片段...

长话短说,而不是写:

textBoxCustomerName.DataBindings.Add("Text", bindingSource, "CustomerName");

我的建议是写如下内容:

dataSource.CreateBinding(textBoxCustomerName, ctl => ctl.Text, data => data.Name);

这样,当您重构实体时,您的代码仍将毫无问题地运行(假设您将客户的Name属性重命名为CompanyName)。

很甜吧?

这里还有一些解决方案如何使数据绑定类型安全并支持重构

于 2010-02-17T19:30:52.653 回答
1

我发现的唯一方法是在对象上使用额外的属性,所以有一个

string DisplayMember
{
    get { return 'name'; }
}

当您重构您的对象时,您只需将返回的字符串更改为您的新属性名称,使其在一个位置而不是几个位置进行更改。

这不是很好,但比应用程序中的硬编码更好!

高温高压

OneSHOT

于 2009-06-15T14:51:56.953 回答
1

如果您将 DisplyMember 留空,则 ListBox 将使用默认的 ToString()。当您在类中覆盖此函数时,列表框将显示适当的值。然后,如果您更改字段的名称,您的构建将在 ToString() 函数中中断。

于 2009-06-15T15:38:31.803 回答
1

C# 6.0开始,您可以使用nameofoperator,它将变量/成员/类型的名称作为字符串返回。

listBox.DisplayMember = nameof(Customer.Name);

(假设有一个Customer带有Name属性的类)

来自官方语言参考

重命名定义时,使用nameof有助于保持代码有效。
以前,您必须使用字符串文字来引用定义,这在重命名代码元素时很脆弱,因为工具不知道检查这些字符串文字。

(强调我的)

于 2018-11-20T16:55:10.060 回答
0

这就是为什么您应该使用属性而不是公共字段来从您的类中公开数据的原因。您可以更轻松地重构内部工作而不会破坏太多。当然,在某些情况下您可能不得不破坏某些东西。

于 2009-06-15T14:51:10.357 回答
0

ReSharper 可以为您做到这一点……尝试获得它 - 一款非常棒的软件。可能CodeRush也可以做到。但我不确定。

于 2009-06-15T14:51:40.077 回答
0

关于我发现“解决”这个“问题”的唯一真正方法是添加一个新的公共 ReadOnly 属性。将该属性命名为“ListDisplay”或类似名称。然后您可以修改实现而不会对 UI 产生任何影响。

这不是一个理想的情况,但它有效。

于 2009-06-15T14:53:06.763 回答