我一直试图将type
转换为IEnumerable
而没有运气。
这是type
我想要IEnumerable
。
public class Container<T>
{
public int GetInt { get; set; }
}
这是获取数据的代码
Container<String> results = client.GetStuff(query);
所以我尝试将变量results
转换为IEnumerable<string>
,但我不知道如何执行此操作。
有人能指出我正确的方向吗?
答案 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;
}
答案 1 :(得分:1)
results
的类型属于Container<String>
,并且Container
通用类已定义,您无法将其投射到IEnumerable<string>
。如果您愿意,您应声明Container<T>
实现此接口并提供实现。
public class Container<T> : IEnumerable<T>
{
// provide an implementation of the missing members.
}