我一直试图将一个转换type为IEnumerable没有运气.
这是type我想做的IEnumerable.
public class Container<T>
{
public int GetInt { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是获取数据的代码,
Container<String> results = client.GetStuff(query);
Run Code Online (Sandbox Code Playgroud)
所以我试图将变量转换results为IEnumerable<string>,但我不知道如何做到这一点.
有人能指出我正确的方向吗?
为了能够将类型的实例用作IEnumerable<T>,类型必须实现 IEnumerable<T>.您通过: IEnumerable<T>在声明中的类名后添加来表示您要执行此操作:
public class Container<T> : IEnumerable<T>
// ...
Run Code Online (Sandbox Code Playgroud)
当您这样做时,您将收到编译器错误,抱怨您没有实现所有必需的成员.您的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();
}
}
Run Code Online (Sandbox Code Playgroud)
现在,实现自己的最常用方法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;
}
Run Code Online (Sandbox Code Playgroud)