[英]Generics and collections … struggling with an implementation
I am trying to figure out a way to leverage generics so I can make the property Value be an actual type that initialized (not sure if this is the correct way of saying it) when my collection class is created. 我试图找出一种利用泛型的方法,这样我就可以在创建我的集合类时使属性Value成为一个初始化的实际类型(不确定这是否是正确的说法)。
I would like to have the syntax be something like: 我希望语法类似于:
var list = new ListItemCollection<Guid>(parameters would go here);
I have the following class: 我有以下课程:
[Serializable]
public class ListItem
{
public object Value { get; set; }
public string Text { get; set; }
public object DataContext { get; set; }
public Nullable<bool> Checked { get; set; }
public ListItem()
{
this.Checked = false;
}
}
I have the following collection: 我有以下集合:
[Serializable]
public class ListItemCollection : List<ListItem>
{
public ListItem this[object value]
{
get
{
foreach (var child in this)
{
if (child.Value.Equals(value))
return child;
}
return null;
}
}
public bool Contains(object value)
{
foreach (var child in this)
{
if (child.Value.Equals(value))
return true;
}
return false;
}
public void Add(object value, string text)
{
this.Add(value, text, null);
}
public void Add(object value, string text, object dataContext)
{
var child = new ListItem();
child.Value = value;
child.Text = text;
child.DataContext = dataContext;
this.Add(child);
}
public ListItemCollection()
{
}
public ListItemCollection(IEnumerable items,
string displayMember,
string valueMember,
bool showEmptyItem,
string emptyItemText,
object emptyItemValue)
{
if (showEmptyItem)
{
this.Add(emptyItemValue, emptyItemText);
}
foreach (object item in items)
{
object text = null;
object value = null;
text = item.GetType().GetProperty(displayMember).GetValue(item, null);
value = item.GetType().GetProperty(valueMember).GetValue(item, null);
// Add the item
this.Add(value, text.ToString(), item);
}
}
}
You could make the ListItem
class generic: 您可以使
ListItem
类通用:
[Serializable]
public class ListItem<T>
{
public T Value { get; set; }
public string Text { get; set; }
public object DataContext { get; set; }
public Nullable<bool> Checked { get; set; }
public ListItem()
{
this.Checked = false;
}
}
Which makes the collection also generic: 这使得该系列也具有通用性:
[Serializable]
public class ListItemCollection<T> : List<ListItem<T>>
{
...
}
You'll just need to make ListItem
and ListItemCollection
generic. 您只需要使
ListItem
和ListItemCollection
通用。
[Serializable]
public class ListItem<T>
{
public T Value { get; set; }
public string Text { get; set; }
public object DataContext { get; set; }
public Nullable<bool> Checked { get; set; }
public ListItem()
{
this.Checked = false;
}
}
[Serializable]
public class ListItemCollection<T> : List<ListItem<T>>
{
public ListItem<T> this[T value]
{
get
{
foreach (var child in this)
{
if (object.Equals(child.Value, value))
return child;
}
return null;
}
}
public bool Contains(T value)
{
foreach (var child in this)
{
if (object.Equals(child.Value, value))
return true;
}
return false;
}
public void Add(T value, string text)
{
this.Add(value, text, null);
}
public void Add(T value, string text, object dataContext)
{
var child = new ListItem<T>();
child.Value = value;
child.Text = text;
child.DataContext = dataContext;
this.Add(child);
}
public ListItemCollection()
{
}
public ListItemCollection(IEnumerable items,
string displayMember,
string valueMember,
bool showEmptyItem,
string emptyItemText,
T emptyItemValue)
{
if (showEmptyItem)
{
this.Add(emptyItemValue, emptyItemText);
}
foreach (object item in items)
{
object text = null;
T value = default(T);
text = item.GetType().GetProperty(displayMember).GetValue(item, null);
value = (T)item.GetType().GetProperty(valueMember).GetValue(item, null);
// Add the item
this.Add(value, text.ToString(), item);
}
}
}
(I changed your childValue.Value.Equals()
calls to object.Equals
to allow for null values.) (我改变了你的
childValue.Value.Equals()
调用object.Equals
允许空值)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.