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();
}
}
问题是我不能换课。它们是我不应该更改的数据模型的一部分问题是我不能更改为类。它们是我不应该改变的数据模型的一部分