Основываясь на коде JustinStolle (спасибо), я хотел найти решение, которое могло бы быть универсальным без указания имен столбцов.
В этом примере используются данные временной таблицы, но, конечно, их можно корректировать по мере необходимости.
Вот что я получил:
DECLARE @htmlTH VARCHAR(MAX) = '',
@htmlTD VARCHAR(MAX)
--get header, columns name
SELECT @htmlTH = @htmlTH + '<TH>' + name + '</TH>' FROM tempdb.sys.columns WHERE object_id = OBJECT_ID('tempdb.dbo.#results')
--convert table to XML PATH, ELEMENTS XSINIL is used to include NULL values
SET @htmlTD = (SELECT * FROM #results FOR XML PATH('TR'), ELEMENTS XSINIL)
--convert the way ELEMENTS XSINIL display NULL to display word NULL
SET @htmlTD = REPLACE(@htmlTD, ' xsi:nil="true"/>', '>NULL</TD>')
SET @htmlTD = REPLACE(@htmlTD, '<TR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">', '<TR>')
--FOR XML PATH will set tags for each column name, <columnName1>abc</columnName1><columnName2>def</columnName2>
--this will replace all the column names with TD (html table data tag)
SELECT @htmlTD = REPLACE(REPLACE(@htmlTD, '<' + name + '>', '<TD>'), '</' + name + '>', '</TD>')
FROM tempdb.sys.columns WHERE object_id = OBJECT_ID('tempdb.dbo.#results')
SELECT '<TABLE cellpadding="2" cellspacing="2" border="1">'
+ '<TR>' + @htmlTH + '</TR>'
+ @htmlTD
+ '</TABLE>'
var dog_arr = Array.Convert(animal_arr, x => (Dog) x);
При использовании LINQ это будет
oldarray.Cast<Dog>().ToArray();
Может быть, вы вообще сможете создать его как массив Dog []?
Дано:
interface ICage {
Animal[] GetAnimals();
}
Если вы создаете экземпляр массива Animal [] с Dogs в нем, вы не можете преобразовать массив:
class DogCage : ICage {
Animal[] GetAnimals() { return new Animal[] { spot, fido }; }
}
Если вы создаете экземпляр массива Dog [] с Dogs в нем, он все равно может быть возвращен как Animal [] массив, но вы также можете преобразовать массив обратно в Dog [].
class DogCage : ICage {
Animal[] GetAnimals() { return new Dog[] { spot, fido }; }
}
Теперь это будет работать:
Dog[] dogs = (Dog[])cage.GetAnimals();
Вы можете использовать общую коллекцию, например List from System.Collections.Generic
вместо массива, тогда используйте следующее:
List<Animal> animals = new List<Animal>();
animals.Add(new Dog());
List<Dog> dogs = animals.ConvertAll(delegate(Animal animal) { return (Dog)animal; });
Если он вам действительно нужен в массиве, вы также можете сделать:
animals.ConvertAll(delegate(Animal animal) { return (Dog)animal; }).ToArray();