¿Puedo construir una clase como se muestra a continuación de forma dinámica mediante la reflexión? No hay métodos, solo variables públicas, algunos tienen atributos personalizados.Usar la reflexión para crear una clase (para crear una clase dinámica FileHelper)
Se requiere el método .Emit (por lo que he visto, "Emitir" parece un poco desafiante).
Estoy usando software desde www.FileHelpers.net, y requiere una clase. Todas mis definiciones de archivo están en una tabla de base de datos, y me gustaría que todo sea más dinámico (es decir, no cambia el código cuando aparece una nueva columna en el archivo).
[FileHelpers.DelimitedRecord(",")]
public class FileRow
{
[FileHelpers.FieldQuoted('"', QuoteMode.OptionalForBoth)]
public string Borrower_First_Name;
[FileHelpers.FieldQuoted('"', QuoteMode.OptionalForBoth)]
public string Borrower_Last_Name;
public string Borrower_Email;
}
Actualización 1: Sobre la base de la respuesta de Vlad a continuación que necesitaba para hacer referencia a la DLL, aquí está cómo lo hice:
// need to reference the FileHelpers.dll from our own .exe directory
string diskFilenameFileHelpersDLL =
System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().Location) +
@"\FileHelpers.dll";
Actualización 2: También, después de hacer lo que sugirió Vlad, así es como me llamo FileHelper y recorra los resultados. Probablemente transferiré los datos a una lista.
Assembly assembly = compiledResult.CompiledAssembly;
// Simple Data Test
lineContents = "John,Doe,[email protected]";
FileHelperEngine engine = new FileHelperEngine(assembly.GetType("FileRow"));
// FileRow[] FileRowArray = (FileRow[])engine.ReadString(lineContents);
Object[] FileRowArray = engine.ReadString(lineContents);
Object myObject = FileRowArray[0]; // only 1 row of data in this example
// Get the type handle of a specified class.
Type myType = assembly.GetType("FileRow");
// Get the fields of the specified class.
FieldInfo[] myField = myType.GetFields();
Console.WriteLine("\nDisplaying fields values:\n");
for (int i = 0; i < myField.Length; i++)
{
Object objTest = myField.GetValue(i);
string tempName = myField[i].Name;
Object objTempValue = myField[i].GetValue(myObject);
string tempValue = System.Convert.ToString(objTempValue);
Console.WriteLine("The value of {0} is: {1}",
tempName, tempValue);
}
Tome un vistazo a [hola, mundo ... Reflection.Emit estilo!] (Http://blogs.msdn.com/b/joelpob/archive/2004/01/21/61411.aspx) –
¿Emite específicamente crear un .DLL o .EXE? Solo necesito una clase en la memoria, nada guardado en el disco. – NealWalters
Estaba diciendo que NO necesito guardar en el disco. – NealWalters