2011-10-27 34 views
11

Tôi có một phương thức chung để chuyển đổi id từ một chuỗi (ví dụ: được lấy từ Giá trị của một HiddenField trên Biểu mẫu ASP.NET) thành mục tiêu gõ và làm điều gì đó với nó.Chuyển đổi giá trị từ chuỗi thành loại chung chung hoặc là Guid hoặc int

private void MyMethod<T>(string rawId, Action<T> doSomethingWithId) 
{ 
    T id = (T)Convert.ChangeType(rawId, typeof(T)); 
    doSomethingWithId(id); 
} 

T sẽ là mã Guid hoặc Int32 và mã trên ở trên (khi đang chạy) khi nó là Guid, cho rằng dàn diễn viên từ chuỗi đến hướng dẫn không hợp lệ.

Sau đó, tôi nghĩ rằng tôi có thể thử để kiểm tra các loại và nếu Guid, nhanh chóng một Guid mới:

var id = default(T); 
if (id is Guid) 
    id = new Guid(rawId); 
else 
    id = (T)Convert.ChangeType(rawId, typeof(T)); 

bây giờ điều này mang lại cho một lỗi (tại thời gian biên dịch) rằng Guid không thể được chuyển đổi sang loại T

Không chắc chắn cách khắc phục sự cố này. Bất kỳ đề xuất?

Trả lời

21

mã bên dưới hoạt động tốt với chuyển đổi thành Hướng dẫn. kiểm tra xem nó

id = (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString(text); 
4

Nếu T hoặc sẽ Guid hoặc Int32 sau đó nó không thực sự rất chung chung, phải không? Chỉ cần viết hai phương thức thay thế - với tên khác hoặc có thể là quá tải. Tôi không thấy lợi ích trong việc sử dụng Generics ở đây, và nó có thể làm cho mã của bạn phức tạp hơn nó cần phải có.

+0

Bạn nói đúng, nhưng đây là một chút của một ví dụ giả tạo, có nhiều đến phương pháp đó và nó đơn giản hóa mọi thứ trong bối cảnh rộng hơn về những gì tôi đang làm. –

+0

@Veli: Đây là lý do tại sao bạn nên cẩn thận khi viết một câu hỏi và đưa ra một bức ảnh đại diện. Tôi vẫn sẽ xem xét tách nó thành hai phương thức không chung chung mà có thể sử dụng một phương thức chung chung chung như * part * của việc thực hiện. –

1

Bạn có thể thử một cái gì đó giống như có lẽ đây:

private void MyMethod<T>(string rawId, Action<T> doSomethingWithId) 
{ 
    T id = (T)Activator.CreateInstance(typeof(T), new object[] { rawId }); 
    doSomethingWithId(id); 
} 
Các vấn đề liên quan