Estamos implementando IEnumerator e IEnumerable en nuestra clase
static void Main(string[] args) { ParsingFile data = new ParsingFile(); foreach (var line in data) // Calls the current, the implicit type of line is object but we want is as a DataRow { //call MoveNext } } public class ParsingFile : IEnumerator , IEnumerable { object IEnumerator.Current //need the object to be of type DataRow to avoid casting in foreach { //return a DataRow } public IEnumerator GetEnumerator() { return this; } public bool MoveNext() { //Do something } }El tipo de retorno de actual es objeto pero desea devolver explícitamente DataRow. Por favor, háganos saber cuál será el enfoque para lograr esto.
Honestamente, a menos que tenga requisitos muy particulares, es mejor que use un bloque iterador aquí, es decir, simplemente escriba:
public class ParsingFile : IEnumerable<DataRow> { // use an iterator block for the typed API public IEnumerator<DataRow> GetEnumerator() { //Do something that involves, perhaps in a loop // yield return someValue; // and/or // yield break; } // use explicit implementation for the untyped API IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); } Absolutamente puede implementar su propio enumerador de tipo fuerte, lo que puede (aunque no es estrictamente necesario) significar implementar IEnumerator<T> , pero hay muchas trampas (como permitir la enumeración concurrente independiente) que hacen que sea más seguro dejar el compilador hace el trabajo duro.
En lugar de implementar un IEnumerator , cuya interfaz especifica que el actual es un objeto, debe implementar IEnumerator<T>
public class ParsingFile : IEnumerator<DataRow> { public DataRow Current { get; } // rest of code ommited for brevity }Como mencionó jon skeet, implemente IEnumerable<DataRow> o IEnumerator<DataRow> en su lugar.
Sugeriría nunca implementar tanto IEnumerator como IEnumerable en la misma clase. Considera lo siguiente:
var myParsingFile = ... var dr1 = myParsingFile.First(); var dr2 = myParsingFile.First();En su caso, dr1 y dr2 serían objetos diferentes, y eso es muy confuso.
También puede buscar bloques de iteradores para encontrar una forma más fácil de hacer enumeradores.