2012-03-06 50 views
4

我有以下扩展方法:扩展方法没有发现(未装配参考问题)

public static EntitySet<T> ToEntitySetFromInterface<T, U>(this IList<U> source) 
    where T : class, U 
{ 
    var es = new EntitySet<T>(); 
    IEnumerator<U> ie = source.GetEnumerator(); 
    while (ie.MoveNext()) 
    { 
     es.Add((T)ie.Current); 
    } 
    return es; 
} 

和Im尝试如下使用它:

List<IItemMovement> p = new List<IItemMovement>(); 
    EntitySet<ItemMovement> ims = p.ToEntitySetFromInterface<ItemMovement, IItemMovement>(); 

其中ItemMovement实现IItemMovement。编译器会抱怨:

“System.Collections.Generic.List”不包含一个 定义为“ToEntitySetFromInterface”和没有扩展方法 “ToEntitySetFromInterface”接受 类型的第一参数“System.Collections.Generic 。列表'可以找到( 你缺少一个使用指令或程序集参考吗?)

不,我不缺少一个参考。如果我只是输入包含它弹出的方法的静态类的名称,那么扩展方法也是如此。 Thnx

+0

im not sure List list = new List ();会编译? – AaronHS 2012-03-06 11:30:18

+1

否则这个代码适用于我(带有嘲弄的ItemMovement和IItemMovement – AaronHS 2012-03-06 11:32:24

+2

我相信这个问题与intellisense无关,如果你不能编译它,那么它几乎不会是intellisense的错误 – demoncodemonkey 2012-03-06 11:45:48

回答

2

此代码适用于我,并且它是您的代码的直接副本,减去ItemMovement及其接口,因此该部分可能有问题?

public class TestClient 
{ 
    public static void Main(string[] args) 
    { 
     var p = new List<IItem>(); 
     p.Add(new Item { Name = "Aaron" }); 
     p.Add(new Item { Name = "Jeremy" }); 

     var ims = p.ToEntitySetFromInterface<Item, IItem>(); 

     foreach (var itm in ims) 
     { 
      Console.WriteLine(itm); 
     } 

     Console.ReadKey(true); 
    } 
} 

public class Item : IItem 
{ 
    public string Name { get; set; } 
    public override string ToString() 
    { 
     return Name; 
    } 
} 

public interface IItem 
{ 
} 

public static class ExtMethod 
{ 
    public static EntitySet<T> ToEntitySetFromInterface<T, U>(this IList<U> source) where T : class, U 
    { 
     var es = new EntitySet<T>(); 
     IEnumerator<U> ie = source.GetEnumerator(); 
     while (ie.MoveNext()) 
     { 
      es.Add((T)ie.Current); 
     } 
     return es; 
    } 
} 
+0

好吧我觉得真的这不是一个汇编ref问题,但它是一个使用问题,我复制了你的代码并且它工作了,但是当我把它复制到与上面的代码相同的类文件时,我没有想到我已经打折了命名空间问题,通过测试我是否可以调用扩展方法类LinqExtensions,实际上我可以。因此,不确定如何在不使用完全限定名称空间的情况下调用该类,但如果使用未正确声明,则无法使用扩展方法? Thnx。 – rism 2012-03-06 21:34:27

1

编译器错误的这一部分是键:“没有扩展方法‘ToEntitySetFromInterface’接受类型‘System.Collections.Generic.List’的第一个参数”。

您的ToEntitySetFromInterface<T,U>扩展方法定义为接受IList<U>,但您试图用List<T>而不是IList<T>来调用它。由于类型不匹配,compliler没有找到您的扩展方法。

+0

你好,我不明白你的意思是列表?我打电话给ToEntitySe tFromInterface (this IList source),所以IList类型由IItemMovement的U类型定义,即ILIst 。因为(这个IList 源)决定了扩展方法可以应用于哪种类型,在这种情况下是IList 和p = IList ,我不太关注你所说的。注意上面我有:列表但即使改变到IList 我仍然得到相同的问题/错误。 – rism 2012-03-06 21:04:43

+0

@rism,我错了。我很抱歉。 – 2012-03-07 10:54:07