[英]How do I convert a List<interface> to List<concrete>?
我有一個接口定義為:
public interface MyInterface {
object foo { get; set; };
}
以及實現該接口的類:
public class MyClass : MyInterface {
object foo { get; set; }
}
然后我創建一個函數,它返回一個 ICollection,如下所示:
public ICollection<MyClass> Classes() {
List<MyClass> value;
List<MyInterface> list = new List<MyInterface>(
new MyInterface[] {
new MyClass {
ID = 1
},
new MyClass {
ID = 1
},
new MyClass {
ID = 1
}
});
value = new List<MyClass>((IEnumerable<MyClass>) list);
return value;
}
它會編譯但會拋出一個
無法將“System.Collections.Generic.List
1[MyInterface]' to type 'System.Collections.Generic.IEnumerable
對象1[MyInterface]' to type 'System.Collections.Generic.IEnumerable
1[MyClass]”。
例外。 我究竟做錯了什么?
A List<MyInterface>
通常不能轉換為List<MyClass>
,因為第一個列表可能包含實現MyInterface
但實際上不是MyClass
類型的對象的對象。
但是,由於在您的情況下,您知道如何構造列表並且可以確定它僅包含MyClass
對象,因此您可以使用 Linq 執行此操作:
return list.ConvertAll(o => (MyClass)o);
但是List<MyInterface>
顯然不是List<MyClass>
。
思考:
interface IAnimal { }
class Cat : IAnimal { }
class Dog : IAnimal { }
var list = new List<IAnimal> { new Cat(), new Dog() };
然后
var cats = (List<Cat>)list;
荒誕!
還,
var cats = list.Cast<Cat>();
荒誕!
更遠
var cats = list.ConvertAll(x => (Cat)x);
荒誕!
相反,你可以說
var cats = list.OfType<Cat>();
您可以使用Cast<>
擴展方法:
return list.Cast<MyClass>();
我發現 Automapper 對於將接口轉換為具體類非常有用。
這是可能的,這就是泛型發光的地方! 這是一個簡單的例子:
public interface ICountable
{
int Count { get; set; }
}
public class PopularName : ICountable
{
public string Name { get; set; }
public int Count { get; set; }
}
public class PopularSize : ICountable
{
public int Size { get; set; }
public int Count { get; set; }
}
現在你需要像這樣聲明你的方法(或你的類)泛型:
public bool HasAnyValue<T>(List<T> countableModel) where T : ICountable
{
return countableModel.Count > 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.