2012-03-01 26 views
5

Tôi đang cố gắng để viết một phương pháp để coverting một đối tượng nhất định cho một thể hiện của một loại nhất định. Tôi bắt đầu với điều này:C# Giúp tôi với một số tuyệt vời đúc awesomeness

private static T TryCast<T>(object o) 
{ 
    return (T) o; 
} 

Đi vào, tôi biết rằng không được đi làm, nhưng nó minh họa khái niệm này. Bây giờ, tôi sẽ bắt đầu gặp vấn đề khi tôi có các loại sẽ không tự động truyền, như chuỗi -> DateTime. Tôi đã cố gắng sử dụng Convert Class để đối phó với những trường hợp này, nhưng tôi chỉ nhận được một lỗi thời gian biên dịch thay vì một lỗi thời gian chạy. Các mã sau đây được biên dịch lỗi "Không thể đúc biểu hiện của loại 'string' gõ 'T'

private static T TryCast<T>(object o) 
{ 
    var typeName = typeof (T).FullName; 

    switch (typeName) 
    { 
     case "System.String": 
      return (T) Convert.ToString(o); 
     default: 
      return (T) o; 
    } 
} 

Tôi cũng nhận thức Convert.ChangeType(), nhưng tôi đang tự hỏi nếu nó sẽ xử lý cạnh trường hợp mà tôi sẽ xử lý khác trong chuyển đổi ở trên, như chuỗi đã nêu -> DateTime mà tôi thường sử dụng Convert.ToDateTime cho.

private static T TryCast<T>(object o) 
{ 
    return (T)Convert.ChangeType(o, typeof(T)); 
} 

Vì vậy, lựa chọn tốt nhất của tôi là gì? tôi có thể tiếp cận hoàn toàn khả thi, tôi có thể lấy nó từ đó.

+0

OK, để đưa ra một ngữ cảnh nhỏ, việc sử dụng ngay lập tức cho phương pháp này là gán động các thuộc tính trên một thể hiện kiểu T từ các giá trị cột trong một đối tượng DataRow. Tôi muốn chuyển vào một từ điển trong đó Key = property name trên instance và Value = column name trên DatRow. Tôi đã có sự phản ánh bằng văn bản để có được PropertyInfos từ kiểu và thiết lập các giá trị cá thể. Bit đúc này là mảnh cuối cùng của câu đố của tôi. Tôi muốn nó có thể tái sử dụng hết mức có thể, nhưng nếu giới hạn phạm vi của bạn đối với ví dụ của tôi làm cho nó dễ dàng hơn, vì vậy hãy là nó. –

+0

Tôi biết rằng ví dụ thứ 2 ở trên NÊN tạo ra lỗi trình biên dịch và tại sao. Tôi chỉ sử dụng nó để minh họa cách tiếp cận, cảm ơn. Không phải là mới: <) –

Trả lời

6

Convert.ChangeType nên xử lý các trường hợp cạnh; nó ủy quyền cho IConvertible.

Để trả lời câu hỏi, trình biên dịch không biết rằng Tstring.
Do đó, nó không cho phép bạn truyền giữa các loại không liên quan (giống như bạn không thể truyền Button đến TextBox).

Bạn có thể làm việc xung quanh rằng bằng cách đúc để object đầu tiên:

return (T)(object)o.ToString(); 

Bây giờ, mỗi chuyển đổi riêng lẻ được phép bởi trình biên dịch (đó là hoặc là một sự liệng lên trực tiếp hoặc nhìn xuống trực tiếp), và bạn biết rằng toàn bộ điều này sẽ hoạt động vì TString.

+0

Tại sao tôi không nghĩ về điều này? Hãy xem những gì mọi người khác nói, nhưng điều này cũng có thể là câu trả lời được chấp nhận. –

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