Я собираюсь изучить упомянутый ExpandoObject (кстати, я голосовал за это решение, поскольку оно кажется более простым), но да, это возможно.Я строю класс в одном из моих проектов, где сторонняя утилита требует, чтобы строка CSV была определена как класс.
Вы можете построить код (я включил \ r \ n, чтобы я мог прочитать полученный код):
string code = "using FileHelpers;\r\n\r\n";
code += "[DelimitedRecord(\"" + delimiter + "\")]\r\n";
code += "public class CustomCSVInputFile ";
code += "{ \r\n";
foreach (string column in columnList)
{
code += " public string " + column.Replace(" ", "") + ";\r\n";
}
code += "}\r\n";
CompilerResults compilerResults = CompileScript(code);
...
public static CompilerResults CompileScript(string source)
{
CompilerParameters parms = new CompilerParameters();
FileHelperEngine engine;
parms.GenerateExecutable = false;
parms.GenerateInMemory = true;
parms.IncludeDebugInformation = false;
string path = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase).Replace("file:\\", "").Trim();
parms.ReferencedAssemblies.Add(Path.Combine(path, "FileHelpers.dll"));
CodeDomProvider compiler = CSharpCodeProvider.CreateProvider("CSharp");
return compiler.CompileAssemblyFromSource(parms, source);
}
... Как я уже говорил, если бы мне пришлось сделать это снова, я бы исследовал ExpandoObject, но определенно возможно создать класс из DataTable.Вам нужно будет опросить имена столбцов, чтобы построить свои поля;в моем примере был список имен столбцов, предоставленных строкой с разделителями ",".
Мой пример взят из очень конкретного случая использования, но этого должно быть достаточно для начала работы, если ExpandoObject не работает для вас.