2013-08-21 21 views
5

Điều này liên quan đến câu hỏi Are there any project templates for using T4 to generate classes? của tôi. Tôi có danh sách các chuỗi (nvarchar) giá trị tham số tôi cần để tạo đúng các thuộc tính lớp đã gõ cho.Việc sử dụng TryParse liên tiếp có phải là cách âm thanh để đoán 'loại thực' của chuỗi không?

Các giá trị là tất cả nguyên thủy - phức tạp nhất là DateTime - trong tập {int, double, bool, DateTime}. Hiện tại tôi có các thuộc tính đã được mã hóa bằng tay cho một trong nhiều danh sách như vậy và phân tích chuỗi tôi bắt đầu bằng DateTime.TryParseExact. Nếu điều đó không thành công, tôi thử Double.TryParse, và ở phía dưới tôi từ bỏ đoán và giả sử nó thực sự là một chuỗi.

Đây có phải là cách tiếp cận khá hay, hoặc có các phương pháp phức tạp hoặc chính xác khác mà tôi nên sử dụng?

+0

Tôi nghĩ rằng có một chủ đề ở đây trước đây ... một cái gì đó giống như một chuỗi chung.Is () phương pháp –

+2

Thêm cột với mô tả loại của hồ sơ, do đó bạn sẽ không phải đoán? – BartoszKP

+0

"0" có thể là nhiều trong số các loại này, làm thế nào để biết nó thực sự là gì? –

Trả lời

3

Nếu tập hợp giá trị chỉ là [double, DateTime, bool], đây sẽ là phương pháp đầy đủ nhưng khá âm thanh. Chỉ có sự chồng chéo giữa các bộ đó (true luôn là bool5 không bao giờ là bool).

Có cả hai intdouble làm cho đề xuất này có chút bực bội vì có một lượng lớn trùng lặp. Về cơ bản, bất kỳ int nào cũng có thể được xem là double. Tôi làm cách nào để diễn giải ví dụ 4 nếu nó xuất hiện trong tập hợp giá trị? Nó có thể được diễn giải theo cả hai cách và nếu các giá trị thay đổi theo thời gian, bạn cũng có thể thấy loại mã được tạo của bạn thay đổi.

Hãy xem xét liệu một cột luôn có số nguyên đơn giản là trùng hợp ngẫu nhiên hay không. Do đó bạn tạo ra giá trị int và đã viết một chút mã phụ thuộc vào chúng là int. Sau đó một tháng hoặc lâu hơn sau đó một số không toàn bộ đã được thêm vào và đột nhiên bạn đang nhổ ra các giá trị double. Điều này có lẽ sẽ có ảnh hưởng không tầm thường đối với mã của bạn.

Cách tiếp cận cá nhân tôi sẽ thực hiện là chỉ cần có một bảng khác quyết định loại nội dung.

+0

Điểm tốt. OP có thể hình dung được sự khác biệt giữa int và double bằng cách cố gắng phân tích cú pháp thành int đầu tiên. Nếu toàn bộ cột "cột" có thể phân đôi thành số nguyên, thì có thể phân biệt chúng với lược đồ hiện tại của mình, hoặc bằng cách cấu trúc nhân đôi theo ký hiệu khoa học hoặc bằng cách thêm một số ký tự định danh như "d", "f", "m" như anh ta sử dụng cho một chữ trong mã. – KeithS

2

Hãy xem Convert.ChangeTypeTypeDescriptor.GetConverter.

Tôi đã viết một phương pháp khuyến nông để làm điều này cho tôi:

public static T Convert<T>(this object obj) 
{ 
    T result; 
    try 
    { 
    result = (T)System.Convert.ChangeType(obj, typeof(T)); 

    if (object.ReferenceEquals(result, null)) 
    { 
     var typeConverter = !obj.IsNullable() 
     ? TypeDescriptor.GetConverter(typeof(T)) 
     : new NullableConverter(typeof(T)); 

     result = obj is string 
     ? (T)typeConverter.ConvertFromString(obj as string) 
     : (T)typeConverter.ConvertTo(obj, typeof(T)); 
    } 
    } 
    catch (Exception) 
    { 
    result = default(T); 
    } 

    return result; 
} 

public static bool IsNullable<T>(this T obj) 
{ 
    return Nullable.GetUnderlyingType(typeof(T)) != null; 
} 

Cách sử dụng:

var itemsToConvert = new[] { "4", "5.98", "false", DateTime.Now.ToString() }; 
var @int = itemsToConvert[0].Convert<int>(); 
var @double = itemsToConvert[1].Convert<double>(); 
var @bool = itemsToConvert[2].Convert<bool>(); 
var @dateTime = itemsToConvert[3].Convert<DateTime>(); 

Console.WriteLine(@"int: {0}, Type: {1}", @int, @int.GetType()); 
Console.WriteLine(@"double: {0}, Type: {1}", @double, @double.GetType()); 
Console.WriteLine(@"bool: {0}, Type: {1}", @bool, @bool.GetType()); 
Console.WriteLine(@"DateTime: {0}, Type: {1}", @dateTime, @dateTime.GetType()); 

Output:

int: 4, Loại: System.Int32
đôi: 5.98, Loại: Hệ thống.Double
bool: False, Loại: System.Boolean
Ngày giờ: 2013/08/21 06:01:07 PM, Loại: System.DateTime

Hy vọng điều này sẽ hữu ích.

Các vấn đề liên quan