2013-12-14 22 views
1

我有一個可以接受List<IMyInterface>作爲參數在一個構造使用界面的列表參數<T>

public class MyClass 
{ 
    public MyClass(List<IMyInterface> elements) 
    { 
    } 
} 

,擁有,因爲這

public partial class MyEntity 
{ 
    public string id {get;set;} 
    . . . 
} 

產生的EF實體擴展一個類這個類實現了IMyInterfaseBool MyEntity及其擴展名在同一個命名空間中)

public partial class MyEntity : IMyInterfase 
{ 
    public bool MyInterfaseImplementation {get;set;} 
    . . . 
} 

而在我的視圖模型構造

var x = from a in db.MyEntity 
     select a; 

如果我嘗試使用a.ToList()作爲參數,我類扔參數無效錯誤

我期待這樣的: 如果MyEntity工具IMyInterfase,那麼MyClass必須接受它作爲參數。

我對這種方法有錯嗎?什麼是正確的方法來做到這一點?

+0

如果使用接口,爲什麼不使用'ICollection '?您應該始終查找最少指定的方法參數。 'IEnumerable'也可以工作,但你可能不希望'MyClass'接收未執行的查詢。 –

+0

@GertArnold Tks爲您提供幫助,我建立了一個接受''List ''的類,其中T可以是任何實現SpecificInterface的類。真的不明白你的消化。 –

+0

這只是一般性評論,並非真正適用於解決方案(爲此,請參閱下面的評論)。我的意思是'List'比'ICollection'更具指定性。如果'ICollection'足夠好,爲什麼不使用它呢?它給構造者的呼叫者更自由,例如通過'HashSet '的'Array '等 –

回答

1

您遇到此問題的原因是List<MyEntity>List<IMyInterface>不一樣。最容易做的事情是投中的每個對象列表中IIMyInterface

var x = from a in db.MyEntity 
     select a as IMyInterface; 

這樣x.ToList()將返回List<IMyInterface>而不是List<MyEntity>,你就可以將它傳遞給MyClass的構造。

編輯:

由於@Gert在評論中提到的,你將需要進行如下修改查詢:

var x = (from a in db.MyEntity select a).AsEnumerable() 
             .Cast<IMyInterface>() 
             .ToList(); 
+0

但現在它顯示一些錯誤''只有實體類型或複雜的類型在Linq Queryes上被引用' –

+0

這聽起來像是和'MyClass'的實現有關,應該在一個新的問題中提出。 –

+0

現在問題不在於構造函數,現在問題出現在''LINQ''查詢 –

0
var x = (from a in db.MyEntity 
    select a).ToList(); 

var c = new MyClass(x); 

如果還是不行,請嘗試:

var x = (from a in db.MyEntity 
    select a).OfType<IMyInterface>().ToList(); 

我不知道如果List<T>是協變的。

+0

這意味着如果任何類實現''IMyinterface''必須被接受爲''MyClass''構造函數的參數嗎? –

+0

@Wiktor,協方差只與接口相關,所以'List '絕對不是協變的('IList '不適用於此事)。 –

+0

@AdiLester:協變是**不與接口相關。數組不是接口,它們是協變的。當然,列表顯然不是。 –

1

鑑於IEnumerable<out T>T,你應該能夠做到:

(from a in db.MyEntity 
    select a).ToList<IMyInterface>() 

請注意,List<T>本身是而不是協變(在T上沒有「out」修飾符)。


另一種解決方案是在構造函數中的參數改變的東西,是協變的,就像IReadOnlyList<out T>,如:

public MyClass(IReadOnlyList<IMyInterface> elements) 

你只需要這兩種解決方案的一個,當然。

相關問題