2012-03-21 47 views
108

Có cách nào để làm cho phương pháp này chung chung để tôi có thể trả về một chuỗi, bool, int hoặc double? Ngay bây giờ, nó trả về một chuỗi, nhưng nếu nó có thể tìm thấy "true" hoặc "false" làm giá trị cấu hình, tôi muốn trả về một bool ví dụ.Làm cách nào để tạo kiểu trả về của một phương thức chung?

public static string ConfigSetting(string settingName) 
    { 
     return ConfigurationManager.AppSettings[settingName]; 
    } 
+0

Có cách nào để bạn có thể biết loại cài đặt nào là? – thecoshman

+2

Tôi nghĩ câu hỏi bạn thực sự muốn hỏi là "Làm thế nào để cấu hình ứng dụng của tôi được gõ mạnh?" Đã quá lâu rồi kể từ khi tôi làm việc với điều đó để viết một câu trả lời đúng đắn. – Simon

+0

Yah, lý tưởng là tôi không muốn chuyển loại này vào phương thức. Tôi sẽ chỉ có 4 loại tôi đã đề cập. Vì vậy, nếu "true"/"false" được đặt, tôi muốn hàm này trả về một boolean (không cần truyền nó vào phương thức), tôi có thể kết hợp int và double thành double, và mọi thứ khác phải là một chuỗi. Câu trả lời đã được trả lời sẽ hoạt động tốt, nhưng tôi cần phải chuyển loại mỗi lần, điều này có thể là tốt. – MacGyver

Trả lời

234

Bạn cần phải làm cho nó một phương pháp chung chung, như thế này:

public static T ConfigSetting<T>(string settingName) 
{ 
    return /* code to convert the setting to T... */ 
} 

Nhưng gọi sẽ phải xác định loại họ mong đợi. Sau đó bạn có thể có khả năng sử dụng Convert.ChangeType, giả định rằng tất cả các loại có liên quan được hỗ trợ:

public static T ConfigSetting<T>(string settingName) 
{ 
    object value = ConfigurationManager.AppSettings[settingName]; 
    return (T) Convert.ChangeType(value, typeof(T)); 
} 

Tôi không hoàn toàn bị thuyết phục rằng tất cả điều này là một ý tưởng tốt, tâm trí bạn ...

+10

/* mã để chuyển đổi cài đặt thành T ... */và sau đây là toàn bộ tiểu thuyết :) –

+1

Điều này có yêu cầu bạn không biết loại cài đặt bạn muốn nhận không, điều này có thể không thực hiện được. – thecoshman

+0

@thecoshman: Vâng OP * đã yêu cầu * một phương pháp chung, vì vậy đó là những gì tôi đã đưa ra - nhưng với một lời nhắc nhở rằng người gọi * sẽ * cần biết loại có liên quan. –

20

Bạn có thể sử dụng Convert.ChangeType() :

public static T ConfigSetting<T>(string settingName) 
{ 
    return (T)Convert.ChangeType(ConfigurationManager.AppSettings[settingName], typeof(T)); 
} 
-1
private static T[] prepareArray<T>(T[] arrayToCopy, T value) 
    { 
     Array.Copy(arrayToCopy, 1, arrayToCopy, 0, arrayToCopy.Length - 1); 
     arrayToCopy[arrayToCopy.Length - 1] = value; 
     return (T[])arrayToCopy; 
    } 

tôi đã biểu diễn này trong suốt mã của tôi và muốn có một cách để đặt nó vào một phương pháp. Tôi muốn chia sẻ điều này ở đây vì tôi không phải sử dụng Convert.ChangeType cho giá trị trả lại của mình. Đây có thể không phải là phương pháp hay nhất nhưng nó có hiệu quả đối với tôi. Phương thức này lấy một mảng kiểu generic và một giá trị để thêm vào cuối mảng. Sau đó mảng được sao chép với giá trị đầu tiên bị tước và giá trị được đưa vào phương thức được thêm vào cuối mảng. Điều cuối cùng là tôi trả về mảng chung.

0

Có rất nhiều cách để làm điều này (liệt kê theo ưu tiên, cụ thể cho vấn đề của OP)

  1. Lựa chọn 1/cách tiếp cận Straight - Tạo nhiều chức năng cho từng loại mà bạn mong đợi hơn là có một generic chức năng.

    public static bool ConfigSettingInt(string settingName) 
    { 
        return Convert.ToBoolean(ConfigurationManager.AppSettings[settingName]); 
    } 
    
  2. Lựa chọn 2/Khi bạn không muốn sử dụng phương pháp ưa thích của chuyển đổi - Diễn viên: giá trị cho đối tượng và sau đó để loại generic.

    public static T ConfigSetting<T>(string settingName) 
    { 
        return (T)(object)ConfigurationManager.AppSettings[settingName]; 
    } 
    

    Note - này sẽ ném ra một lỗi nếu các diễn viên là không hợp lệ (trường hợp của bạn). Tôi sẽ không khuyên bạn nên làm điều này nếu bạn không chắc chắn về loại đúc, thay vì đi cho tùy chọn 3.

  3. Tùy chọn 3/Chung với loại an toàn - Tạo chức năng chung để xử lý chuyển đổi loại.

    public static T ConvertValue<T,U>(U value) where U : IConvertible 
    { 
        return (T)Convert.ChangeType(value, typeof(T)); 
    } 
    

    Note - T là loại dự kiến, lưu ý các nơi khó khăn ở đây (loại U phải IConvertible để cứu chúng ta khỏi các lỗi)

+0

Tại sao chọn tùy chọn thứ ba trong 'U'? Không có điểm nào khi làm như vậy, và nó làm cho phương pháp khó gọi hơn. Chỉ cần chấp nhận 'IConvertible' để thay thế. Tôi không nghĩ rằng nó đáng giá bao gồm tùy chọn thứ hai cho câu hỏi này vì nó không trả lời câu hỏi đang được hỏi. Có lẽ bạn cũng nên đổi tên phương thức trong tùy chọn đầu tiên ... –

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