我有一個類型項目,我定義自定義類對象,我想在我的主應用程序中工作。這些對象基本上是從字符串派生出來的,並被解析成一個結構體如何支持多種自定義類型?
我有兩個問題
1 - 在一個單獨的項目,我有一個文件讀取器類,我掃描的文本文件我已經定義字符串類型。例如通過正則表達式。目前,我將我的類型項目添加爲項目引用,並且只在正常閱讀類的頂部列出正則表達式。當我找到一個類型,我將字符串轉換爲適當的類型。然而,我怎麼能改善這個,這是它直接連接到我的類型項目 - 所以當我用新類型更新它的Read類知道它應該支持新類型?
2 - 我試圖從文本文件中讀取後創建一個在這些特定類型上工作的DLL。我如何告訴我的DLL,我想支持我的類型項目中的類型?我是否必須爲每個想要處理的類型創建一個重載函數?我使用界面嗎?
任何意見非常感謝。
編輯:加什麼I''m試圖做的示例代碼
//項目1 - 處理IO操作,如閱讀和寫作在讀類工作
//功能是找到一個多個預定義的字符串類型由正則表達式...一旦發現它們被轉換爲所述數據結構(通過傳遞字符串中的其他項目中定義類型的類構造函數
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;
}
}
}
// TYPE 2
namespace MessageTypes.Type2
{
public sealed class FullString
{
public string FS { get; set; }
public FullString(string s)
{
FS = s;
}
}
}
// PROJECT 3
class DoSomethingToTypeObject{
//detect type and call appropriate function to process
}
// PROJECT 4 - MAIN PROJECT與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);
}
}
}
}
我會試試這個。我用我想要做的事情的示例代碼更新了我的原始帖子。請看看它是否會改變您的任何建議。我不確定這個**字符串FoundItem {get;組; } string Expression {get; }'**在界面中。什麼是Founditem和表達式(匹配和正則表達式?)。對我來說,當我找到它的時候,它是一個字符串,但稍後它會轉換爲數據結構。這很重要嗎? – sjs
FoundItem和Expression只是在接口中的成員的例子,並不一定要在那裏。 我在看你提供的代碼,你只是使用基於類型的特定轉換的結果,還是你需要使用這個結構,因爲它以後呢? –
我的DoSomethingClass會修改對象內部的字符串。例如,說我的字符串對象表示一個CSV文件中的一行。也許我需要用特定值替換第三列。在這種情況下,我需要返回相同的結構,以便寫入函數可以訪問組成該行的所有值。 DoSomthing的每個實現(每個類型)將保持結構完整。我可能有其他模式(DoSomething2)使用該對象,但執行不同的功能,如檢索值。只有Write類將輸出一個字符串,因爲它最初是在文件中。 – sjs