2011-01-09 24 views
6

Có thể trả lại loại generic bằng cách sử dụng extension methods không?Trả lại phương thức mở rộng bằng cách sử dụng generics

Ví dụ, tôi có phương pháp sau đây:

// Convenience method to obtain a field within a row (as a double type) 
public static double GetDouble(this DataRow row, string field) { 
    if (row != null && row.Table.Columns.Contains(field)) 
    { 
     object value = row[field]; 
     if (value != null && value != DBNull.Value) 
      return Convert.ToDouble(value); 
    } 
    return 0; 
} 

này hiện đang sử dụng như sau:

double value = row.GetDouble("tangible-equity"); 

nhưng tôi muốn sử dụng đoạn mã sau:

double value = row.Get<double>("tangible-equity"); 

Điều này có thể và nếu có, phương pháp sẽ như thế nào?

+0

BTW, bạn biết đấy, bạn chỉ cần viết "double value = row.Get (" hữu hình-công bằng ");" và bỏ qua "" vì trình biên dịch sẽ tìm ra nó –

Trả lời

12

Làm thế nào về vấn đề này một:

public static T Get<T>(this DataRow row, string field) where T: IConvertible 
    { 
     if (row != null && row.Table.Columns.Contains(field)) 
     { 
      object value = row[field]; 
      if (value != null && value != DBNull.Value) 
       return (T)Convert.ChangeType(value, typeof(T)); 
     } 
     return default(T); 
    } 

Convert.ChangeType có nhiều chuyển đổi xử lý linh hoạt hơn như trái ngược với chỉ đúc. Điều này khá nhiều phản ánh mã ban đầu của bạn, chỉ chung chung.

+2

+1 cho Convert.ChangeType –

+0

Làm việc với nơi mã của Mahesh không –

+0

+1 Đồng ý. Tốt hơn để sử dụng Convert.ChangeType() –

3

Có thể. Nó có thể giống như sau:

// Convenience method to obtain a field within a row (as a T type) 
public static T Get<T>(this DataRow row, string field) { 
    if (row != null && row.Table.Columns.Contains(field)) 
    { 
     object value = row[field]; 
     if (value != null && value != DBNull.Value) 
      return (T)value; 
    } 
    return default(T); 
} 
+0

System.InvalidCastException: Truyền được chỉ định không hợp lệ. –

+0

Điều đó sẽ xảy ra nếu cột cơ sở dữ liệu của bạn không cùng loại với câu trả lời của T. @ BrokenGlass phải chuyển đổi đúng đối tượng của các loại khác nhau. – sgriffinusa

+0

Điều đó sẽ xảy ra thường đủ để xử lý các loại dữ liệu từ DB –

1

DataRow có phương pháp mở rộng gọi là Field sẽ làm rất nhiều việc bạn đang cố gắng làm. Tôi không chính xác chắc chắn như thế nào nó sẽ hành xử với một giá trị null trên một đôi (tôi biết nó sẽ xử lý các loại nullable). Điều này có thể không chính xác những gì bạn đang tìm kiếm, nhưng đáng xem.

double value = row.Field<double>("tangible-equity"); 
+0

Tôi ở lại rõ ràng về Linq vì vậy không có phương thức () có sẵn –

+0

Nó không phải là LINQ. Nó chỉ là một phương pháp mở rộng trên DataRow. Nó gần như chính xác những gì bạn đang cố gắng xây dựng. – sgriffinusa

+0

Tôi nghĩ bạn phải thêm ref vào System.Data.DataSetExtensions.dll –

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