2013-12-14 23 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) 

你只需要这两种解决方案的一个,当然。

相关问题