And*_*kov 100 .net c# casting interface
public interface IDic
{
int Id { get; set; }
string Name { get; set; }
}
public class Client : IDic
{
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能投List<Client>
来List<IDic>
?
Jon*_*eet 228
你不能把它(保留参考标识) - 这是不安全的.例如:
public interface IFruit {}
public class Apple : IFruit {}
public class Banana : IFruit {}
...
List<Apple> apples = new List<Apple>();
List<IFruit> fruit = apples; // Fortunately not allowed
fruit.Add(new Banana());
// Eek - it's a banana!
Apple apple = apples[0];
Run Code Online (Sandbox Code Playgroud)
现在你可以转换List<Apple>
成IEnumerable<IFruit>
在.NET 4/C#4,由于协方差,但如果你想有一个List<IFruit>
你必须建立一个新的列表.例如:
// In .NET 4, using the covariance of IEnumerable<T>
List<IFruit> fruit = apples.ToList<IFruit>();
// In .NET 3.5
List<IFruit> fruit = apples.Cast<IFruit>().ToList();
Run Code Online (Sandbox Code Playgroud)
但是,这是不一样的铸造原名单-因为现在有两个单独的列表.这是安全的,但您需要了解对一个列表所做的更改将不会在另一个列表中看到.(当然,将会看到列表引用的对象的修改.)
Cast迭代器和.ToList():
List<IDic> casted = input.Cast<IDic>().ToList()
会成功的
最初,我说协方差是可行的-但正如乔恩正确指出的那样;不,不会!
最初我也愚蠢地拒绝了ToList()
电话
如果你会使用 LINQ 那么你可以这样做......
List<Client> clientList = new List<Client>();
List<IDic> list = clientList.Select(c => (IDic)c).ToList();
Run Code Online (Sandbox Code Playgroud)
小智 5
List<Client> listOfA = new List<Client>();
List<IDic> list = listOfA.Cast<IDic>().ToList();
Run Code Online (Sandbox Code Playgroud)
我也有这个问题,在阅读了 Jon Skeet 的回答后,我将代码从 using 修改List<T>
为 use IEnumerable<T>
。尽管这不能回答 OP 的原始问题How can I cast List<Client>
toList<IDic>
,但它确实避免了这样做的需要,因此可能对遇到此问题的其他人有所帮助。这当然假设需要使用的代码List<IDic>
在您的控制之下。
例如:
public void ProcessIDic(IEnumerable<IDic> sequence)
{
// Implementation
}
Run Code Online (Sandbox Code Playgroud)
代替:
public void ProcessIDic(List<IDic> list)
{
// Implementation
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
48360 次 |
最近记录: |