我有一个类型项目,我定义自定义类对象,我想在我的主应用程序中工作。这些对象基本上是从字符串派生出来的,并被解析成一个结构体如何支持多种自定义类型?
我有两个问题
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