给定以下类型:
public interface IMyClass { } public class MyClass : IMyClass { }
我想知道如何将a转换List<MyClass>为a List<IMyClass>?我对协方差/相反方差主题尚不完全清楚,但是我知道我不能因此而明确地列出List。
List<MyClass>
List<IMyClass>
我只能提出这个简单的解决方案。缺乏优雅,浪费资源:
... public List<IMyClass> ConvertItems(List<MyClass> input) { var result = new List<IMyClass>(input.Count); foreach (var item in input) { result.Add(item); } return result; } ....
您如何以更优雅/更出色的方式解决它?
( 请注意,我需要.NET 2.0解决方案,但是出于完整性考虑,我也很高兴看到使用较新的框架版本的更优雅的解决方案。 )
最简单的方法可能是使用ConvertAll:
ConvertAll
List<IMyClass> converted = original.ConvertAll<IMyClass>(x => x);
即使您使用的是.NET 2,也可以使用lambda语法(如果使用的是VS2008或更高版本)。否则,总会有匿名方法:
List<IMyClass> converted = original.ConvertAll<IMyClass>( delegate (MyClass x) { return x; });
在.NET 3.5中,您可以使用LINQ Cast,OfType甚至可以Select:
Cast
OfType
Select
var converted = original.Cast<IMyClass>().ToList(); var converted = original.OfType<IMyClass>().ToList(); var converted = original.Select(x => (IMyClass) x).ToList();
在.NET 4.0中ToList,由于以下因素的协方差,您可以直接使用而无需中间强制转换IEnumerable<T>:
ToList
IEnumerable<T>
var converted = original.ToList<IMyClass>();