Come faccio a creare un metodo che converte un DataRowCollection ad un array di oggetti di un tipo generico in C #?

StackOverflow https://stackoverflow.com/questions/2809419

  •  25-09-2019
  •  | 
  •  

Domanda

Sto cercando di creare un metodo che accetta un DataTable o un DataRowCollection e lo converte in un array di un tipo generico. Qualcosa di simile a questo:

    public static T[] ConvertToArray<T>(DataTable dataTable)
    {
        List<T> result = new List<T>();

        foreach (DataRow dataRow in dataTable.Rows)
            result.Add((T)dataRow);

        return result.ToArray();
    }

Il problema è questa linea

result.Add((T)dataRow);

che dà non può convertire System.Data.DataRow a T.

Se faccio la stessa cosa senza l'utilizzo di un tipo generico, e assicurarsi che la classe degli oggetti hanno un operatore di conversione personalizzato definito, il codice funziona bene.

Quindi la domanda è ora, come faccio a tirare questo di usare farmaci generici?

È stato utile?

Soluzione

Si potrebbe utilizzare un oggetto che fornisce la conversione in un DataRow al tipo:

public interface IDataRowConverter<T>
{
    T Convert(DataRow row);
}

Fornire il convertitore personalizzato per la funzione:

public static T[] ConvertToArray<T>(DataTable dataTable, IDataRowConverter<T> converter)
{
    List<T> result = new List<T>();

    foreach (DataRow dataRow in dataTable.Rows)
        result.Add(converter.Convert(dataRow));

    return result.ToArray();
}

Quindi, implementare l'interfaccia per il vostro tipo di necessaria:

public class MyObjectDataRowConverter : IDataRowConverter<MyObject>
{
    public MyObject Convert(DataRow row)
    {
        MyObject myObject = new MyObject();

        // Initialize object using the row instance

        return myObject;
    }
}

È possibile quindi chiamare la funzione utilizzando questo codice:

MyObject[] objectArray = 
    ConvertToArray<MyObject>(datatable, new MyObjectDataRowConverter());
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top