簡體   English   中英

如何轉換列表<interface>列出<concrete> ?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM