实现接口的列表,并将引用传递给该列表
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 开始有效。
将 internalList
和 inList
键入为 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();
}
}
我有几个不同的对象列表,即
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 开始有效。
将 internalList
和 inList
键入为 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();
}
}