C# 设计泛型数据类

C# 设计泛型数据类,c#,.net,C#,.net,我想弹出一个包含不同类型对象的列表框。我在列表框中显示对象的类型(人性化) public class ListBoxView { private object m_value; public ListBoxView(Object value) { m_value = value; } public override string ToString() { if (m_value is Car)

我想弹出一个包含不同类型对象的列表框。我在列表框中显示对象的类型(人性化)

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; }
    }
}
我创建了一个类ListBoxView,该类重写ToString方法并根据类型返回字符串。我创建了一个ListBoxView列表,并将其数据绑定到listbox

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这样的类是我无法更改的数据模型的一部分。我需要在用户界面方面解决这个问题

实际上,我想我应该在
汽车
上实现
ToString()
人类
等,而不必为这个类操心。否则,每次添加新类型时都必须更新此类


如果您担心类型名的I18n,那么保留这个类,但只有这样您才能通过在资源文件上搜索名称的“本地化”版本,将
ToString()
的结果放入其中。

实际上,我想我应该在
Car
上实现
ToString()
Human
etc,不必为这门课操心。否则,每次添加新类型时都必须更新此类


如果您担心类型名的I18n,那么保留该类,但这样您才能通过搜索资源文件中的“本地化”版本的名称,将
ToString()
的结果放入其中。

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

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);
}

一个很短的解决方案,但可能不是最好的,就是将逻辑从ToString方法移动到listBox1_格式的事件处理程序

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);
}

您的解决方案伸缩性差。特别是,如果您想在
ToString
中处理除
Car
User
以外的其他类型的特殊情况,请查看会发生什么

您应该按照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();
    }
}

您的解决方案伸缩性差。特别是,如果您想在
ToString
中处理除
Car
User
以外的其他类型的特殊情况,请查看会发生什么

您应该按照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();
    }
}

问题是我不能换课。它们是我不应该更改的数据模型的一部分问题是我不能更改为类。它们是我不应该改变的数据模型的一部分