2017-11-18 97 views
1

我一直在尝试将type转换为IEnumerable而没有运气。如何实现IEnumerable <T>?

这是type我试图使IEnumerable

public class Container<T> 
{   
    public int GetInt { get; set; } 
} 

这是获取数据的代码,

Container<String> results = client.GetStuff(query); 

所以我试图将变量转换resultsIEnumerable<string>,但我不知道如何做到这一点。

有人能指出我在正确的方向做到这一点吗?

+1

您的问题没有意义。什么是GetStuff?这里是否得到'string'数据?你不能将一个类转换成IEnumerable类,你可以实现它。 –

+0

@PatrickHofman,填充容器类的方法。 – KyloRen

+0

如何?什么?什么时候? –

回答

5

为了能够使用一个类型的实例作为IEnumerable<T>,类型必须实现IEnumerable<T>。表明您想在声明的类名称后添加: IEnumerable<T>做到这一点:

public class Container<T> : IEnumerable<T> 
// ... 

当你这样做,你会得到编译器错误抱怨说,你还没有实现所有需要的成员。你的IDE应该能够为他们自动生成存根,但是这是你必须做的:

public class Container<T> : IEnumerable<T> 
{ 
    // forward the non-generic version to the generic version 
    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); 

    // implement GetEnumerator from the generic interface 
    public IEnumerator<T> GetEnumerator() 
    { 
     throw new NotImplementedException(); 
    } 
} 

现在,实行最常见的方式自己IEnumerable<T>是裹在内置一个,例如一个List<T>或一个数组。如果这就是你正在做的事情,你可以将GetEnumerator()调用转发给内部实例并完成。

如果你想做一些更复杂的事情,你可以例如使用yield return结构构建您的迭代协议:

public IEnumerator<T> GetEnumerator() 
{ 
    // do some work 
    // then return the first element: 
    yield return default(T); // yeah, you probably have an actual value 

    // do some more work 
    // return another value: 
    yield return default(T); 

    // if you want to abort the iteration prematurely 
    // e.g. based on some condition 
    // you can 
    yield break; 
} 
+0

或者我个人最喜欢的“收益回报”。 –

+0

正是。使用List或Array或一些已经可枚举的集合类实现你的Container。从重新开始爆胎是没有什么收获的。 –

+0

那么会做到这一点。谢谢,我不能接受2分钟。 – KyloRen

1

results的类型为Container<String>,并且当定义泛型类Container时,不能将其转换为IEnumerable<string>。如果你想这样你应该声明Container<T>实现这个接口并提供一个实现。

public class Container<T> : IEnumerable<T> 
{ 
    // provide an implementation of the missing members. 
} 
相关问题