Mam projekt Types, w którym definiuję niestandardowe obiekty klasy, które chcę pracować w mojej głównej aplikacji. Obiekty są w zasadzie wyprowadzane z łańcuchów i przetwarzane w strukturę.Jak obsługiwać wiele typów niestandardowych?
mam dwa problemy
1 - W osobnym projekcie mam klasy czytnika pliku, gdzie skanowanie plików tekstowych dla typów łańcuchowych Mam zdefiniowane. Na przykład przez wyrażenie regularne. Obecnie dodałem mój projekt Types jako odniesienie do projektu i po prostu wypisuję wyrazy regularne u góry mojej klasy odczytu. Kiedy znajdę typ, konwertuję ciąg znaków na odpowiedni typ. Jednak jak mogę to poprawić, aby był bezpośrednio połączony z moim typem projektu - więc kiedy aktualizuję go o nowe typy, klasa Read wie, że powinna obsługiwać nowe typy?
2 - Próbuję utworzyć bibliotekę DLL, która działa na tych określonych typach po ich odczytaniu z pliku tekstowego. Jak mogę poinformować moją bibliotekę DLL, że chcę obsługiwać typy w moim projekcie Types? Czy muszę wykonać przeciążoną funkcję dla każdego typu, nad którym chcę pracować? Czy korzystam z interfejsu?
Każda rada jest bardzo doceniana.
EDIT: Dodano przykład kodu, co I''m próbuje zrobić
// projekt 1 - uchwyty operacji IO jak czytanie i pisanie
// funkcję w klasie odczytu zadaniem jest znaleźć jedną z kilka predefiniowanych typów smyczkowych wyrażenia regularnego ... raz okazało się, że są konwertowane do struktury danych (przekazując ciąg do konstruktora klasy typu zdefiniowanego w innym projekcie
public class Read
{
public string[] FileList { get; set; }
private static Int64 endOffset = 0;
private FileStream readStream;
private StreamReader sr;
private System.Text.RegularExpressions.Regex type1 = new System.Text.RegularExpressions.Regex(@"@123:test");
private System.Text.RegularExpressions.Regex type2 = new System.Text.RegularExpressions.Regex(@"TESTTYPE2");
public Read(string[] fl)
{
FileList = fl;
}
public object ReturnMessage(FileStream readStream, out int x)
{
//readStream = new FileStream(file, FileMode.Open, FileAccess.Read);
x = 0;
//endOffset = 0;
bool found = false;
char ch;
string line = string.Empty;
object message = null;
while (!(x < 0)) //do this while not end of line (x = -1)
{
readStream.Position = endOffset;
//line reader
while (found == false) //keep reading characters until end of line found
{
x = readStream.ReadByte();
if (x < 0)
{
found = true;
break;
}
// else if ((x == 10) || (x == 13))
if ((x == 10) || (x == 13))
{
ch = System.Convert.ToChar(x);
line = line + ch;
x = readStream.ReadByte();
if ((x == 10) || (x == 13))
{
ch = System.Convert.ToChar(x);
line = line + ch;
found = true;
}
else
{
if (x != 10 && (x != 13))
{
readStream.Position--;
}
found = true;
}
}
else
{
ch = System.Convert.ToChar(x);
line = line + ch;
}
}//while - end line reader
//examine line (is it one of the supported types?)
if (type1.IsMatch(line))
{
message = line;
endOffset = readStream.Position;
break;
}
else
{
endOffset = readStream.Position;
found = false;
line = string.Empty;
}
}//while not end of line
return message;
}
}
// projekt 2 - zawiera klasy, które definiują typy
// TYPE1
namespace MessageTypes.Type1
{
public sealed class Type1
{
public List<Part> S2 { get; set; }
public Type1(string s)
{
S2 = new List<Part>();
string[] parts = s.Split(':');
for (int i = 0; i < parts.Length; i++)
{
S2.Add(new Part(parts[i]));
}
}
}
public sealed class Part
{
public string P { get; set; }
public Part(string s)
{
P = s;
}
}
}
// TYP 2
namespace MessageTypes.Type2
{
public sealed class FullString
{
public string FS { get; set; }
public FullString(string s)
{
FS = s;
}
}
}
// projekt 3
class DoSomethingToTypeObject{
//detect type and call appropriate function to process
}
// projekt 4 - główny projekt z GUI
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
if (tabControl1.SelectedIndex == 0) //Processing Mode 1
{
//load file list from main window - Mode1 tab
IOHandler.Read read = new IOHandler.Read(new string[2] { @"C:\file1.txt", @"C:\file2.txt" });
//read files
foreach (string file in read.FileList)
{
//while not end of stream
myobject = read.ProcessFile(file);
DoSomethingtoTypeObject DS = new DoSomethingtoTypeObject(myobject);
//write transoformed object
write(myobject);
}
}
}
}
Spróbuję tego. Zaktualizowałem mój pierwotny wpis, podając przykładowy kod tego, co próbuję zrobić. Proszę spojrzeć na wypadek, gdyby zmieniło się którekolwiek z twoich sugestii. Nie jestem pewien co do tego ** 'string FoundItem {get; zestaw; } string Expression {get; } '** w interfejsie. co to jest founditem i wyrażenie (dopasowanie i wyrażenie regularne?).dla mnie jest to ciąg pierwszy, gdy go znajdę, ale później zostanie przekonwertowany na bazę danych. Czy to ma znaczenie? – sjs
FoundItem i Expression, gdzie po prostu przykład członków w interfejsie i nie musi tam być. Sprawdzam podany kod, czy używasz wyniku określonej transformacji opartej na typie, czy też musisz użyć tej struktury w późniejszym czasie? –
moja DoSomethingClass zmodyfikuje ciąg wewnątrz obiektu. Na przykład powiedz, że mój obiekt typu string reprezentuje linię z pliku CSV. Może muszę zastąpić trzecią kolumnę konkretną wartością. W tym przypadku muszę zwrócić tę samą strukturę, więc funkcja zapisu będzie miała dostęp do wszystkich wartości, które tworzą linię. Każda implementacja DoSomthing (według typu) zapewni nienaruszoną strukturę. Mogę mieć inne tryby (DoSomething2), które wykorzystują obiekt, ale wykonują inną funkcję, np. Pobierają wartość. Tylko klasa Write wypisze ciąg znaków tak jak był pierwotnie w pliku. – sjs