メイン アプリケーションで作業するカスタム クラス オブジェクトを定義するタイプ プロジェクトがあります。オブジェクトは基本的に文字列から派生し、構造に解析されます。
2つの問題があります
1 - 別のプロジェクトに、定義した文字列型のテキスト ファイルをスキャンするファイル リーダー クラスがあります。たとえば、正規表現で。現在、タイプ プロジェクトをプロジェクト参照として追加し、読み取りクラスの先頭に正規表現をリストするだけです。型が見つかったら、文字列を適切な型に変換します。ただし、これを改善して、Types プロジェクトに直接接続するにはどうすればよいですか?新しい型で更新すると、Read クラスは新しい型をサポートする必要があることを認識しますか?
2 - テキスト ファイルから読み取られた後、これらの特定の型で動作する DLL を作成しようとしています。タイプ プロジェクトでタイプをサポートしたいことを DLL に伝えるにはどうすればよいですか? 作業したい型ごとにオーバーロードされた関数を作成する必要がありますか? インターフェイスを使用しますか?
どんなアドバイスでも大歓迎です。
編集:私がやろうとしていることのサンプルコードを追加しました
//PROJECT 1 - 読み取りと書き込みのような IO 操作を処理
します //読み取りクラスの関数の仕事は、正規表現によっていくつかの事前定義された文字列型の 1 つを見つけることです...それらがデータ構造に変換されると、(文字列をコンストラクターに渡すことによって)他のプロジェクトで定義された型クラス
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;
}
}
//PROJECT 2 - タイプを定義するクラスが含まれています
//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;
}
}
}
// タイプ 2
namespace MessageTypes.Type2
{
public sealed class FullString
{
public string FS { get; set; }
public FullString(string s)
{
FS = s;
}
}
}
//プロジェクト 3
class DoSomethingToTypeObject{
//detect type and call appropriate function to process
}
//プロジェクト 4 -- 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);
}
}
}
}