2010-05-19 24 views
11

Tôi cố gắng để chuyển đổi các giá trị của các giá trị T tham số kiểu generic vào số nguyên sau khi thực hiện chắc chắn rằng T là trong thực tế số nguyên:Làm thế nào để chuyển đổi giá trị của Generic Type Argument thành một loại bê tông?

public class Test 
{ 
    void DoSomething<T>(T value) 
    { 
     var type = typeof(T); 
     if (type == typeof(int)) 
     { 
      int x = (int)value; // Error 167 Cannot convert type 'T' to 'int' 
      int y = (int)(object)value; // works though boxing and unboxing 
     } 
    } 
} 

Mặc dù nó hoạt động thông qua boxing và unboxing, đây là một hiệu suất chi phí bổ sung và tôi đã lang thang nếu có một cách để làm điều đó trực tiếp.

+5

Vì vậy, hãy cho tôi hiểu điều này ... Bạn đang xây dựng một phương pháp chung chung, nhưng nó cần phải biết nếu tham số kiểu là một int? Thiết kế của bạn, có điều gì đó sai trái với nó. – Will

+0

Bất kỳ lý do nào để không thêm quá tải 'void DoSomething (int value) {}'? –

+0

Đây là một ví dụ đơn giản. Mã thực tế có nhiều thứ trước và sau khi chuyển đổi được hưởng lợi từ generics –

Trả lời

15

Boxing và unboxing sẽ là cách hiệu quả nhất ở đây, thành thật mà nói. Tôi không biết cách nào để tránh việc xảy ra boxing và bất kỳ hình thức chuyển đổi nào khác (ví dụ: Convert.ToInt32) có khả năng sẽ thực hiện các chuyển đổi bạn thực sự không muốn.

+0

Cảm ơn bạn đã xác nhận suy nghĩ của tôi về quyền anh/unboxing. Calling Convert thực sự sẽ chậm hơn vì có thêm chi phí gọi cũng như boxing/unboxing sẽ xảy ra anyway: Convert.ToInt32 (giá trị đối tượng) lấy đối tượng để T được đóng hộp tại thời điểm này và sau đó unboxed tại một số điểm sau đó. –

2
Convert.ToInt32(value); 

Nên làm điều đó.

1

int và các thành phần cơ bản khác của CLR triển khai IConvertible.

public class Test 
{ 
    void DoSomething<T>(T value) where T : IConvertible 
    { 
     var type = typeof(T); 
     if (type == typeof(int)) 
     { 
      int y = value.ToInt32(CultureInfo.CurrentUICulture); 
     } 
    } 
} 
1
int x = (dynamic)MyTest.Value; 

Tôi biết đây là một chủ đề rất cũ, nhưng đây là cách thực tế để thực hiện. (dynamic) sẽ chuyển đổi giá trị T thành bất kỳ loại nguyên thủy đã biết nào trong thời gian chạy.

0
int id = (dynamic)myobject.SingleOrDefault(); 

HOẶC

int id = (int)myobject.SingleOrDefault(); 

Nó làm việc cho tôi để nhận được giá trị int. Ở đây myobject có giá trị ObjectResult<Nullable<int>>.

0

Cách sau sẽ hoạt động.

int x = (int)(value as int?); 
Các vấn đề liên quan