2009-06-15 1 views
3

Вопрос задан в отношении объекта DataSource. Поэтому рассмотрим, что у меня есть классListBox.DisplayMember = [String] Могу ли я каким-то образом обходить это, кроме строки в .NET?

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 все еще остается на «имя». Это не удастся. Таким образом, это уменьшает мою способность реорганизовать объекты домена. Есть ли способ для этого?

+0

Заканчивать ответ здесь: http://stackoverflow.com/questions/1984165/strong-typing-a-property-name-in-net –

ответ

1

Единственный способ я нашел вокруг этого использовать дополнительные свойства на объектах так есть

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

и когда вы реорганизовать объект, то нужно всего лишь изменить возвращенную строку к новому имени свойства что делает его изменением в одном месте, а не в нескольких.

Это не здорово, но работает лучше, чем hardcoding в приложении!

НТН

ONESHOT

+0

Хорошая идея и прост в реализации, +1. Очевидно, не идеальный, но, как вы сказали, лучше, чем hardcoding везде в приложении. –

0

Вот почему вы должны использовать свойства, а не общедоступные поля, чтобы выставлять данные из ваших классов. Вы можете более легко реорганизовать внутреннюю работу, не нарушая слишком много. Хотя, конечно, будут случаи, когда вам, возможно, придется что-то сломать.

+0

Как это связано? –

0

ReSharper может сделать это за вас ... попробуйте получить его - действительно отличное программное обеспечение. Возможно, CodeRush тоже может это сделать. Но я не уверен.

0

О единственный реальный способ я нашел, чтобы «обойти» этот «вопрос», можно было бы добавить новую общественность, ReadOnly собственности. Назовите это свойство «ListDisplay» или что-то подобное. Затем вы можете изменить реализацию без какого-либо влияния на пользовательский интерфейс.

Это не идеальная ситуация, но она работает.

1

Если вы оставите DisplyMember пустым, ListBox будет использовать значение ToString() по умолчанию. Когда вы переопределите эту функцию в своем классе, в списке появится соответствующее значение. Затем, если вы измените имя поля, ваша сборка будет разбита на функцию ToString().

5

Это sexier and more flexible solution

Отрывок ...

Чтобы сделать длинную историю короткой, а написания:

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

мое предложение написать что-то как:

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

Таким образом, ваш код будет работать без проблем, когда вы реорганизуете своих лиц (допустим, если вы переименовать Name Недвижимость до CompanyName).

Pretty sweet eh?

Кроме того, некоторые решения здесь How to make Databinding type safe and support refactoring