设计通用数据类

时间:2009-07-08 09:00:56

标签: c# .net

我想用不同类型的对象来填充列表框。我在列表框中显示对象的类型(人性化)。

我创建了一个类ListBoxView,它覆盖ToString方法并根据类型返回一个字符串。我创建一个ListBoxView列表并将其数据绑定到列表框。

public class ListBoxView
{
    private object m_value;

    public ListBoxView(Object value)
    {
        m_value = value;
    }

    public override string ToString()
    {
        if (m_value is Car)
            return "Car";
        else if (m_value is User)
            return "Human";
        else
            return "Not defined: " + m_value.GetType().ToString();
    }

    public T Value
    {
        get { return m_value; }
        set { m_value = value; }
    }
}

使用泛型可以更好地解决这个问题吗?由于我是仿制药的新手,我在使用它时遇到了困难。

由于

更新 像Human和Car这样的类是我无法改变的数据模型的一部分。我需要在用户界面端解决这个问题

3 个答案:

答案 0 :(得分:2)

实际上我认为我只是在ToString()Car等上实施Human而根本不打扰这个类。否则,每次添加新类型时都必须更新此类。

如果您担心I18n类型名称,请保留此类,但只有这样您才可以将ToString()的结果通过搜索资源文件中的“本地化”版本的名称

答案 1 :(得分:1)

一个非常简短的解决方案,但可能不是最好的,是将逻辑从ToString方法移动到listBox1_Format事件处理程序。

private string FormatForListbox(object m_value)
{
    if (m_value is Car)
        return "Car";
    else if (m_value is User)
        return "Human";
    else
        return "Not defined: " + m_value.GetType().ToString();
}

private void listBox1_Format(object sender, ListControlConvertEventArgs e)
{
   e.Value = FormatForListbox(e.ListItem);
}

答案 2 :(得分:0)

您的解决方案规模很小。特别是,如果您想在ToString处理除CarUser之外的其他类型的特殊情况,请查看会发生什么。

你应该遵循Neil的建议将这种逻辑放在别处,即在特定的类中 - 作为ToString方法或完全不同的方法(参见代码)。总之,在这里使用泛型无济于事。

interface IInfoProvider {
    String Info { get; }
}

class User : IInfoProvider {
    …
    public override String Info { get { return "Human"; } }
}

class ListBoxView {
    …
    public override string ToString()
    {
        IInfoProvider infovalue = m_value as IInfoProvider;
        if (infovalue != null)
            return infovalue.Info;
        else
            return "Not defined: " + m_value.GetType().ToString();
    }
}