2015-05-26 71 views
-1

我有一个用C#编写的应用程序。我的应用有一个如下所示的类:在C#中使用泛型接口#

public class FinderA 
{ 
    public IEnumerable<FinderA> GetItems() 
    { 
    return FinderA.FindAll(); 
    } 
} 

我想要求其他类做类似的事情。我不能使用基类,因为我的实际实现已经在使用基类。出于这个原因,我想创建一个接口。目前,我尝试以下:

public interface IFinder 
{ 
    IEnumerable<T> GetItems(); 
} 

当我使用这种方法,我得到的是说,一个编译时错误:“类型或命名空间名称‘T’找不到(是否缺少。 ..“为了克服这个问题,我想补充<T>到接口名称的末尾,以便它看起来像这样:

public interface IFinder<T> 
{ 
    IEnumerable<T> GetItems(); 
} 

这反过来又产生另一种说,编译时错误:”使用泛型类型“IFinder '需要1个类型参数'“我的挑战是,我希望接口是通用的,我不想传入一个类型,有没有办法解决这个问题呢?如果是这样,什么/如何?

+1

请求没有任何意义......你不想传入一个类型,但你希望接口是通用的。如果你的界面是通用的,那意味着你必须传入一个类型。 –

+1

@TimothyShields他希望推断它;具体而言,他希望泛型参数始终是实现接口的类型。至少,这就是它的样子。当然,C#中没有这样的功能。 – Servy

+0

一个猜测,根据你如何定义FinderA:'public interface IFinder {IEnumerable GetItems(); }' – ASh

回答

0

有没有办法解决这个问题;在声明类实现接口时,您需要实际提供泛型类型参数。

+0

其实,上面ASh的评论解决了我的问题。 –

+0

@JQueryMobile那么,这不是你实际询问的问题。你问过你是否需要为泛型接口提供泛型参数。如果您描述了您所遇到的实际问题,我们可以帮助您解决该问题,但实际上并未在您的问题中这样做。 – Servy

+0

一个人似乎明白这一点。 –

0

如果你希望你的接口是通用的,但你不愿意提供一个类型参数,你可以返回一个IEnumerable<object>

public interface IFinder { 
    IEnumerable<object> GetItems(); 
} 

所有类类型从System.Object延伸,从而应该能满足任何类型的applicacion(枚举结构会得到盒装)

请注意,这种方法需要对界面的消费者投通用的object实例到适当的类型。

备用(推荐)的方法是使界面使用类型参数,但你必须在方法层面,而不是作为一个提供此时,相应的类型参数

+0

像'enum'和'struct's这样的值类型只会被装箱。 – juharr

+0

这打破了泛型的全部目的。而且,值类型*可以被返回,它们只会被装箱。 – haim770

+0

你们是对的。更新我的答案。 –

0

你可以这样做接口本身的泛型类型。然后

public interface IFinder 
{ 
    IEnumerable<T> GetItems<T>(); 
} 

你的代码可以调用它像这样:

IFinder finder = // Create finder instance 
IEnumerable<MyClass> discoveredClasses = finder.GetItems<MyClass>(); 

如果你想确保MyClass是实现IFinder一类,你可以限制的方法。

public interface IFinder 
{ 
    IEnumerable<T> GetItems<T>() where T : IFinder; 
} 

这将导致以下生成编译器错误:

public class Foo 
{ 
} 

public class Bar 
{ 
    Bar() 
    { 
     IFinder finder = // Create finder. 
     // This fails because <T> (Foo) does not implement IFinder. 
     IEnumerable<Foo> fooItems = finder.GetItems<Foo>(); 
    } 
} 

,但它将使以下编译

public class MyFinderA : IFinder 
{ 
    IEnumerable<T> GetItems<T>() where T : IFinder 
    { 
     return // Create collection of T 
} 

public class Bar 
{ 
    Bar() 
    { 
     IFinder finder = // Create finder. 
     // This works as <T> (MyFinderA) is an IFinder implementation 
     IEnumerable<MyFinderA> finderItems = finder.GetItems<MyFinderA>(); 
    } 
} 
+0

但是他所拥有的方法应该满足这个契约*不会在返回类型中有所不同,所以该方法在概念上不是通用的,而是接口本身。 – Servy

+0

他需要向我们展示一个更好的例子。听起来像这样可以通过在接口上添加一个间接级别来解决,如果他想具体定义对象,然后一般地获取它们;我不明白_how_ GetItems在他的示例代码中用于实践。 –