实现接口的列表,并将引用传递给该列表

Lists that implement an Interface, and passing a reference to that list

我有几个不同的对象列表,即

List<Character> characters;
// ...

其中一些列表是实现相同接口的对象:

public interface IDebugPrints
// ...

public class Character : IDebugPrints
// ...

我有一个 class,我想在其中存储对实现 IDebugPrints 的列表(在其构造函数中传递给它)的引用,即

List<IDebugPrints> inList 

以便稍后我可以遍历该列表(在这种情况下打印出有关原始列表中当前 条目 的调试信息)。

我不知道该怎么做。如果我将列表作为 IEnumerable 传递,它会生成原始列表的 copy,这对我有用,因为在该副本之后添加和删除了对象。

感谢任何帮助。基于这里的其他一些问题,我觉得这是不可能的,但希望得到确认。

编辑:

这里有更多的伪代码:

public interface IDebugPrints
// ...

public class Character : IDebugPrints
// ...

public class StoreList
{
    private List<IDebugPrints> internalList;

    public StoreList( List<IDebugPrints> inList )
    {
         internalList = inList;
    }
}

// The I have the various lists, for example
List<Character> characters;

// ...

// And I want to pass that list
StoreList sl = new StoreList( characters );

最后一行给出了编译错误:

Cannot convert from System.Collections.Generic.List<Character> to Systems.Collections.Generic.List<IDebugPrints>

这样编译:

using Microsoft.VisualStudio.TestPlatform.UnitTestFramework;
using System.Collections.Generic;

public interface IDebugPrints
{

}

public class Character : IDebugPrints
{

}

public class StoreList
{
    private List<IDebugPrints> internalList;

    public StoreList(List<IDebugPrints> inList)
    {
        internalList = inList;
    }
}

[TestClass]
public class Test1
{
    [TestMethod]
    public void MyTest()
    {
        var characters = new List<IDebugPrints>();
        characters.Add(new Character());
        var sl = new StoreList(characters);
    }
}

List<Character> characters 作为 IEnumerable<IDebugPrint> 传递。这从 C# 4 开始有效。

internalListinList 键入为 IEnumerable<IDebugPrint>

从不在 C# 中复制引用类型(除非程序员明确实现和请求)。 .NET 没有复制任意引用类型实例的通用方法。

这意味着您的 IEnumerable<IDebugPrint> 类型的变量将引用现有的可修改列表。

无法将 List<x> 直接转换为 List<y>,除非您使用如下转换方法: List<x> listX = listY.Cast<x>();

我会将 List<Character> 作为 IList 传递给 StoreList。 使用 .OfType<>() 扩展,您可以迭代给定类型的子项。 这样,列表就不会被复制。

这样您的 StoreList 就可以迭代它,而不取决于您传递的类型,只要项目是从 IDebugPrint 继承的,ShowAllInfo 将显示 Info.

这是一个例子:

public interface IDebugPrints
{
    string Info { get; set; }

    void ShowInfo();
}

public class Character : IDebugPrints
{
    public string Info {get;set;}

    public void ShowInfo()
    {
        Console.WriteLine(Info);
    }
}

public class StoreList
{
    private IList internalList;

    public StoreList(IList inList)
    {
        internalList = inList;
    }

    public void ShowAllInfo()
    {
        // I love the OfType<>() extension, it only returns the items of type IDebugPrints.
        foreach (var item in internalList.OfType<IDebugPrints>())
            item.ShowInfo();
    }

}

class Program
{
    static void Main(string[] args)
    {
        List<Character> characters = new List<Character>();

        characters.Add(new Character { Info = "Character 1" });
        characters.Add(new Character { Info = "Character 2" });

        // And I want to pass that list
        StoreList sl = new StoreList(characters);


        sl.ShowAllInfo();

        Console.ReadKey();
    }
}