Tùy thuộc vào ngữ pháp hoàn chỉnh của bạn, bạn có một vài lựa chọn: nếu đó là một ngữ pháp rất đơn giản và bạn không phải kiểm tra lỗi trong đó, bạn có thể chỉ cần đi theo bên dưới (sẽ nhanh chóng)
var input = "(params (abc 1.3)(sdc 2.0)(www 3.05)....)";
var tokens = input.Split('(');
var typeName = tokens[0];
//you'll need more than the type name (assembly/namespace) so I'll leave that to you
Type t = getStructFromType(typeName);
var obj = TypeDescriptor.CreateInstance(null, t, null, null);
for(var i = 1;i<tokens.Length;i++)
{
var innerTokens = tokens[i].Trim(' ', ')').Split(' ');
var fieldName = innerTokens[0];
var value = Convert.ToDouble(innerTokens[1]);
var field = t.GetField(fieldName);
field.SetValue(obj, value);
}
tuy nhiên cách tiếp cận đơn giản này yêu cầu chuỗi phù hợp hoặc sẽ hoạt động không đúng.
Nếu ngữ pháp phức tạp hơn một chút, ví dụ: lồng nhau() sau đó cách tiếp cận đơn giản đó sẽ không hoạt động.
bạn có thể thử sử dụng regEx nhưng vẫn yêu cầu ngữ pháp khá đơn giản, do đó nếu bạn có một ngữ pháp phức tạp, lựa chọn tốt nhất của bạn là trình phân tích cú pháp thực. Irony là dễ sử dụng vì bạn có thể viết tất cả trong C# đơn giản (một số kiến thức của BNF là một mặc dù).
Nguồn
2010-05-03 19:07:57
bạn có thể hiển thị ví dụ đầy đủ để bao gồm tất cả chuỗi mẫu không? – Glennular
Rõ ràng những gì bạn đang yêu cầu. Bạn muốn có những giá trị nào cho a và b? Cấu trúc có động không, tức là nó có thể không phải lúc nào cũng là cùng một tập các biến? –
Bạn không chắc chắn cách 'abc' là gấp đôi, bạn có thể tìm hiểu thêm về ví dụ của mình không? – RedFilter