Convert List<T> to List<object>
本文关键字:gt lt List object to Convert | 更新日期: 2023-09-27 18:15:09
我对泛型类有一个问题。像这样:
public abstract class IGroup<T> : IEnumerable where T : class {
protected List<T> groupMembers;
protected List<IGameAction> groupIGameActionList;
public IGroup() {
groupMembers = new List<T>();
groupIGameActionList = new List<IGameAction>();
//groupIGameActionList.Add(new DieGameAction(groupMembers));
}
}
和第二类:
class DieGameAction : IGameAction {
List<object> gameObjectList;
public DieGameAction(List<object> objectList) {
gameObjectList = objectList;
}
}
我不知道如何在注释行中转换groupMembers
。这不起作用,因为它不能转换(List<T>
到List<object>
)。那么我该怎么做呢?
groupMembers.Cast<object>().ToList();
但这看起来不是个好事情。您正在创建一个新的空列表,它将不再与原始列表相关。
你使用这些类的方式会告诉你这是不是一个好主意。如果您计划通过向单个类添加项来更新两个列表,则不适合。那么也许你的DieGameAction
也应该是通用的:DieGameAction<T>
。然后你可以给出原始列表,而不需要强制转换。
但是,还有另一个危险:如果你为iggroup设置了一个新列表,它将不会反映到DieGameAction。
所以,这完全取决于你想做什么
我刚刚面临同样的问题,导致我在这里。对我来说有效的解决方案是转换为IEnumerable of Object而不是List of Object
(System.Collections.Generic.IEnumerable<object>)groupMembers;
旧问题,但是通过将变量声明为IList
而不是List<object>
,您可以将任何类型的列表(或数组)分配给变量,然后简单地将其强制转换为IList<Whatever>
(当然,如果将其强制转换为错误的类型,它将抛出异常)。我发现这比每次你想给变量赋值时都要做.Cast<object>()
更有效。
我将只关注提供一个解决方案。你可以使用IList
class DieGameAction : IGameAction {
IList<object> gameObjectList;
public DieGameAction(IList<object> objectList) {
gameObjectList = objectList;
}
}
那么你可以提供一个illist
public abstract class IGroup<T> : IEnumerable where T : class {
protected List<T> groupMembers;
protected List<IGameAction> groupIGameActionList;
public IGroup() {
groupMembers = new List<T>();
groupIGameActionList = new List<IGameAction>();
groupIGameActionList.Add(new DieGameAction(new ObjectListAdapter<T>(groupMembers)));
}
}
我将尝试并提供许多可能的解决方案之一,使用System.Collections.ObjectModel.Collection
public class ObjectListAdapter<T> : System.Collections.ObjectModel.Collection<T>, IList<object>
{
public ObjectListAdapter(IList<T> wrappedList)
: base(wrappedList)
{
}
public int IndexOf(object item)
{
return base.IndexOf((T)item);
}
public void Insert(int index, object item)
{
base.Insert(index, (T)item);
}
public new object this[int index]
{
get
{
return base[index];
}
set
{
base[index] = (T)value;
}
}
public void Add(object item)
{
base.Add((T)item);
}
public bool Contains(object item)
{
return base.Contains((T)item);
}
public void CopyTo(object[] array, int arrayIndex)
{
this.Cast<object>().ToArray().CopyTo(array, arrayIndex);
}
public bool IsReadOnly
{
get { return false; }
}
public bool Remove(object item)
{
return base.Remove((T)item);
}
public new IEnumerator<object> GetEnumerator()
{
return this.Cast<object>().GetEnumerator();
}
}
在尝试使用不支持的对象时,列表更改将抛出类型强制转换异常,就像我在这里编写的那样,但是您也可以根据自己的喜好处理它。
现在,对于IList
请注意,重要的是列表将在使用的两个地方显示相同,因为它们基本上使用相同的底层list对象。
让我知道这是否回答了你的问题,通过将其标记为答案,或不重复:)
我今天有类似的问题,但我直接调用了LINQ .ToArray()
,它工作得很好。应该是shorter
而不是casting
。所以你可以说
groupMembers.ToArray();
我是这样做的:
List<myclass> listMyclass = new List<myclass>();
var listObject = listMyclass.ToList<object>();