Dzięki FastMember możesz to zrobić bez konieczności przechodzenia przez DataTable (co w moich testach ponad dwukrotnie zwiększa wydajność):
using(var bcp = new SqlBulkCopy(connection))
using(var reader = ObjectReader.Create(data, "Id", "Name", "Description"))
{
bcp.DestinationTableName = "SomeTable";
bcp.WriteToServer(reader);
}
Zauważ, że ObjectReader może również pracować ze źródłami nieogólnymi i nie jest konieczne wcześniejsze określanie nazw członków (chociaż prawdopodobnie chcesz użyć ColumnMappings aspekt SqlBulkCopy jeśli nie określisz ich w ObjectReader sam).