Tôi có một dự án Loại nơi tôi xác định các đối tượng lớp tùy chỉnh mà tôi muốn làm việc trong ứng dụng chính của mình. Các đối tượng cơ bản có nguồn gốc từ chuỗi và phân tích cú pháp thành một cấu trúc.Làm cách nào để hỗ trợ nhiều loại tùy chỉnh?
Tôi có hai vấn đề
1 - Trong một dự án riêng biệt Tôi có một lớp người đọc tập tin nơi tôi quét tập tin văn bản cho các loại chuỗi Tôi đã xác định. Ví dụ bằng biểu thức chính quy. Hiện tại tôi đã thêm dự án Types của tôi làm tham chiếu dự án và tôi chỉ liệt kê các biểu thức chính quy ở đầu lớp đọc của mình. Khi tôi tìm thấy một loại tôi chuyển đổi chuỗi thành loại thích hợp. Tuy nhiên làm thế nào tôi có thể cải thiện điều này để nó được kết nối trực tiếp với dự án loại của tôi - vì vậy khi tôi cập nhật nó với các kiểu mới, lớp Read biết rằng nó sẽ hỗ trợ các kiểu mới?
2 - Tôi đang cố gắng tạo một DLL hoạt động trên các loại cụ thể sau khi chúng được đọc từ tệp văn bản. Làm thế nào để tôi nói với DLL của tôi rằng tôi muốn hỗ trợ các loại trong dự án loại của tôi? Tôi có phải thực hiện một chức năng quá tải cho từng loại tôi muốn làm việc không? Tôi có sử dụng giao diện không?
Bất kỳ lời khuyên nào được đánh giá cao.
EDIT: Thêm mã ví dụ về những gì I''m cố gắng làm
// DỰ ÁN 1 - xử lý hoạt động IO như Đọc và viết
// chức năng trong công việc lớp đọc là để tìm thấy một trong một số loại chuỗi được xác định trước bởi biểu thức chính quy ... một lần thấy họ được chuyển đổi thành các cấu trúc dữ liệu (bằng cách thông qua chuỗi để xây dựng các kiểu lớp được định nghĩa trong dự án khác
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;
}
}
// dỰ áN 2 - chứa các lớp mà xác định các loại
// 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;
}
}
}
// DỰ ÁN 3
class DoSomethingToTypeObject{
//detect type and call appropriate function to process
}
// DỰ ÁN 4 - DỰ ÁN CHỦ với 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);
}
}
}
}
Tôi sẽ thử điều này. Tôi đã cập nhật bài đăng gốc của mình bằng mã ví dụ về những gì tôi đang cố gắng thực hiện. Hãy xem xét trong trường hợp nó thay đổi bất kỳ đề xuất của bạn. Tôi không chắc chắn về điều này ** 'chuỗi FoundItem {get; bộ; } Biểu thức chuỗi {get; } '** trong giao diện. những gì là founditem và biểu thức (các trận đấu và biểu thức chính quy?).đối với tôi nó là một chuỗi đầu tiên khi tôi tìm thấy nó nhưng nó được chuyển đổi thành cơ sở dữ liệu sau này. Điều này có quan trọng không? – sjs
FoundItem và Expression chỉ là ví dụ về các thành viên trong giao diện và không cần phải ở đó. Tôi đang xem mã bạn đã cung cấp, bạn có đang sử dụng kết quả của một phép biến đổi cụ thể dựa trên loại hay bạn cần sử dụng cấu trúc này như sau này không? –
DoSomethingClass của tôi sẽ sửa đổi chuỗi bên trong đối tượng. Ví dụ: đối tượng chuỗi của tôi đại diện cho một dòng từ tệp CSV. Có lẽ tôi cần phải thay thế cột thứ 3 với giá trị cụ thể. Trong trường hợp này, tôi cần trả về cùng một cấu trúc để chức năng ghi sẽ có quyền truy cập vào tất cả các giá trị tạo nên dòng. Mỗi lần thực hiện DoSomthing (mỗi loại) sẽ giữ nguyên cấu trúc. Tôi có thể có các chế độ khác (DoSomething2) sử dụng đối tượng nhưng thực hiện chức năng khác nhau như truy xuất giá trị. Chỉ có lớp Write sẽ xuất ra một chuỗi như ban đầu trong tập tin. – sjs