Czy mogę zbudować klasę jak pokazano poniżej dynamicznie za pomocą odbicia? Nie ma żadnych metod, tylko zmienne publiczne, niektóre mają niestandardowe atrybuty.Użyj refleksji, aby zbudować klasę (aby zbudować dynamiczną klasę FileHelper)
Czy wymagana jest metoda .Emit (z tego, co widziałem, "Emit" wygląda na nieco trudniejsze).
Używam oprogramowania od www.FileHelpers.net, a to wymaga klasy. Wszystkie moje definicje plików znajdują się w tabeli bazy danych i chciałbym, aby wszystko było bardziej dynamiczne (tj. Żaden kod nie zmienia się, gdy pojawia się nowa kolumna w pliku).
[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;
}
Aktualizacja 1: Na podstawie odpowiedzi Vlada poniżej potrzebowałem odwołać DLL, oto jak to zrobiłem:
// need to reference the FileHelpers.dll from our own .exe directory
string diskFilenameFileHelpersDLL =
System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().Location) +
@"\FileHelpers.dll";
Aktualizacja 2: Ponadto, po tym, co sugeruje Vlad, to w jaki sposób mogę zadzwonić FileHelper i zapętlić wyniki. Prawdopodobnie przeniesie dane do listy.
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);
}
Spójrz na [hello, world ... styl Reflection.Emit!] (Http://blogs.msdn.com/b/joelpob/archive/2004/01/21/61411.aspx) –
Czy emitują konkretnie utworzyć .DLL lub .EXE? Potrzebuję tylko klasy w pamięci, niczego zapisanego na dysku. – NealWalters
Mówiłem, że NIE muszę zapisywać na dysku. – NealWalters