2012-03-27 32 views
12

Có thể viết các công trình tương tự không?
Tôi muốn thiết, bằng cách nào đó, giá trị mặc định cho đối số kiểu T.Các phương pháp chung và các đối số tùy chọn

private T GetNumericVal<T>(string sColName, T defVal = 0) 
    { 
     string sVal = GetStrVal(sColName); 
     T nRes; 
     if (!T.TryParse(sVal, out nRes)) 
      return defVal; 

     return nRes; 
    } 

Bên cạnh đó, tôi thấy liên kết sau: Generic type conversion FROM string
Tôi nghĩ rằng, mã này phải làm việc

private T GetNumericVal<T>(string sColName, T defVal = default(T)) where T : IConvertible 
{ 
    string sVal = GetStrVal(sColName); 
    try 
    { 
     return (T)Convert.ChangeType(sVal, typeof(T)); 
    } 
    catch (FormatException) 
    { 
     return defVal; 
    }    
} 

Trả lời

15

Tôi chưa thử điều này nhưng thay đổi T defVal = 0 thành T defVal = default(T)

4

Nếu bạn biết rằng T sẽ hav ea parameterless constructor bạn có thể sử dụng mới T() như vậy:

private T GetNumericVal<T>(string sColName, T defVal = new T()) where T : new() 

Nếu không, bạn có thể sử dụng mặc định (T)

private T GetNumericVal<T>(string sColName, T defVal = default(T)) 
4

Để trả lời những câu hỏi đó sẽ làm việc để thiết lập giá trị mặc định

private T GetNumericVal<T>(string sColName, T defVal = default(T)) 
{ 
    string sVal = GetStrVal(sColName); 
    T nRes; 
    if (!T.TryParse(sVal, out nRes)) 
     return defVal; 

    return nRes; 
} 

Nhưng bạn không thể gọi phương thức TryParse tĩnh vì trình biên dịch không có cách nào để biết kiểu T khai báo phương thức tĩnh này.

+0

Có, tôi không thể gọi TryParse. Nhưng có lẽ một cái gì đó tương tự? Có lẽ thêm một số ràng buộc để loại tham số (tôi có nghĩa là 'ở đâu: ...')? Nếu các kiểu số thực hiện một số giao diện chuyển đổi. – hardsky

+0

CLR không có khái niệm về "các phương thức tĩnh ảo", trình biên dịch không thể suy ra các phương thức tĩnh từ một kiểu. Theo như tôi biết không có giải pháp sạch cho điều đó. –

+0

http://stackoverflow.com/questions/196661/calling-a-static-method-on-a-generic-type-parameter để biết thêm chi tiết –

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