2011-11-22 31 views
5

(SOLVED) Tôi đang xây dựng một ứng dụng có thể tự động tạo một số điều khiển dựa trên một số mô tả từ tệp XML.
Những gì tôi cần bây giờ là một cái gì đó rất giống với TryParse() phương pháp: một khả năng để kiểm tra (wihtout ném/bắt ngoại lệ), nếu một văn bản trong chuỗi biến có thể được chuyển đổi (hoặc phân tích) thành một loại, tên tôi có khác variabe (myType).
Vấn đề là myType có thể là bất kỳ loại NET: DateTime, Bool, Double, Int32, vvKiểm tra xem chuỗi có thể được chuyển đổi thành loại khác không, loại khác nhau

Ví dụ:

string testStringOk = "123"; 
string testStringWrong = "hello"; 
string myType = "System.Int32"; 

bool test1 = CanCovertTo(testStringOk, myType);  //true 
bool test2 = CanCovertTo(testStringWrong, myType); //false 

như thế nào CanCovertTo(string testString, string testType) chức năng nên xem xét như thế nào?

Gần nhất tôi nhận được là mã sau:

private bool CanCovertTo(string testString, string testType) 
{ 
    Type type = Type.GetType(testType, null, null); 
    TypeConverter converter = TypeDescriptor.GetConverter(type); 

    converter.ConvertFrom(testString); //throws exception when wrong type 
    return true; 
} 

tuy nhiên, nó ném một ngoại lệ trong khi cố gắng để chuyển đổi từ chuỗi sai, và tôi không muốn sử dụng try {} catch() cho điều đó.


Giải pháp:

private bool CanCovertTo(string testString, string testType) 
{ 
    Type type = Type.GetType(testType, null, null); 
    TypeConverter converter = TypeDescriptor.GetConverter(type); 
    return converter.IsValid(testString); 
} 
+1

Tại sao bạn không muốn dùng thử/nắm bắt? – PVitt

+1

Tại sao bạn đang cố gắng chuyển đổi một giá trị trong một hàm có tên là CanConvert? Không thể bạn chỉ cần làm "return converter.CanConvertFrom (typeof (string))" – Grrbrr404

+0

@PVitt: nó chỉ là về "thực hành tốt nhất", tôi đã đọc rằng bạn nên tránh làm việc với trường hợp ngoại lệ với hành động chương trình bình thường. Tôi tin rằng đó là lý do tại sao phương thức TryParse() tồn tại cùng với Parse(). Thành thật mà nói, nếu có một phương pháp tốt hơn điều này, cho phép tôi làm những gì tôi cần, tôi thích cái đó hơn. :) – mj82

Trả lời

6

tôi sẽ kiểm tra phương pháp TypeConverter.IsValid, mặc dù:

Bắt đầu từ phiên bản .NET Framework 4, phương pháp IsValid bắt ngoại lệ từ CanConvertFrom và ConvertFrom phương pháp. Nếu kiểu giá trị đầu vào làm cho CanConvertFrom trả về false, hoặc nếu giá trị đầu vào làm cho ConvertFrom tăng ngoại lệ, phương thức IsValid trả về false.

Điều đó có nghĩa là nếu bạn không dùng thử ... hãy tự mình bắt mình, bạn sẽ chuyển đổi gấp đôi giá trị.

+0

Câu trả lời hay. Điều này thực sự giải quyết được một vấn đề trong một câu hỏi mà tôi đã hỏi tuần trước. – psubsee2003

6

Thay vì chuyển loại dưới dạng chuỗi, bạn nên sử dụng Generics, ví dụ:

public bool CanConvert<T>(string data) 
{ 
    TypeConverter converter = TypeDescriptor.GetConverter(typeof(T)); 
    return converter.IsValid(data); 
} 

Cách sử dụng

bool test1 = CanConvert<Int32>("1234"); // true 
bool test2 = CanConvert<Int32>("hello"); // false 
+0

Generics sẽ yêu cầu OP biết loại ở dạng biên dịch, mà nó sẽ xuất hiện anh ta không. – psubsee2003

+0

Điều đó ** sẽ hoàn hảo **, nếu tôi biết chính xác loại trước đây, hoặc có thể làm một cái gì đó như thế này: 'bool test1 = CanConvert (testStringOk);' Tôi không biết loại tuy nhiên, nó tự động đọc và giữ trong chuỗi vaiable. – mj82

+0

@ mj82 - Ah ok, sẽ cập nhật câu trả lời của tôi cho phù hợp. – James

0

Nếu họ chỉ tích hợp trong các loại .NET, bạn có thể làm việc chuyển đổi dựa trên một System.TypeCode. Bạn có thể lưu trữ mã đánh máy trong XML của mình (hoặc chuyển đổi loại chuỗi thành Kiểu Mã) và thực hiện như sau:

switch (code) 
{ 
    case TypeCode.Boolean: 
     bool.TryParse(value, out result); 
     break; 
    case TypeCode.Int32: 
     int.TryParse(value, out result); 
    ... 
} 
+0

Tôi đã suy nghĩ về nó, nhưng có quá nhiều dòng cho điều đó. :) Với TypeConverter.IsValid, nó có thể được thực hiện với 3 dòng. Dù sao cũng cảm ơn bạn :) – mj82

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