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>)。那么我该怎么做呢?

Convert List<T> to 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 实现,它适应任何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 也可以封装一个IList :

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 你也可以尝试使用IList,它也是由List 所以你基本上不需要做任何事情来让它工作。

请注意,重要的是列表将在使用的两个地方显示相同,因为它们基本上使用相同的底层list对象。

让我知道这是否回答了你的问题,通过将其标记为答案,或不重复:)

我今天有类似的问题,但我直接调用了LINQ .ToArray(),它工作得很好。应该是shorter而不是casting。所以你可以说

groupMembers.ToArray();

我是这样做的:

List<myclass> listMyclass = new List<myclass>();
var listObject = listMyclass.ToList<object>();