2016-01-14 19 views
6

Tôi đã xem xét nhiều câu hỏi tương tự như vậy, nhưng không ai trong số họ thực sự xúc động với những gì tôi muốn làm. Những gì tôi đang cố gắng để làm được đọc từ một nguồn bên ngoài một danh sách các biến mà cũng bao gồm kiểu dữ liệu của họ vào một mảng chuỗi:Phương pháp với nhiều loại trả lại

Ví dụ:

ID/Key  Type Value/Data; 
varName1 bool true; 
varName2 string str; 
varName3 int  5; 

tôi sau đó lưu trữ đây là những đối tượng vào một cuốn từ điển như các đối tượng có chứa nhiều chuỗi, với ID cũng đóng vai trò là khóa.

Những gì tôi muốn làm bây giờ là tạo ra một phương pháp có sử dụng một câu lệnh switch mà phôi chuỗi vào datatype đúng, và trả về nó mà không cần phải chỉ định bất cứ điều gì trong cuộc gọi phương pháp. Các chức năng nên tìm một cái gì đó như thế này:

public ??? Method(string key) 
{ 
    if(dictionary.ContainsKey(ID)) 
    { 
     Var temp = dictionary[ID]; 

     switch (temp.Type) 
     { 
      case "bool": 
       return Convert.ToBoolean(temp.Value); 

      case "int" 
       return Convert.ToInt(temp.Value); 

      case "string" 
       return temp.Value; 
     } 
    } 

    return "NULL"; 
} 

các lời gọi phương thức nên tìm một cái gì đó như thế này:

int x = Method(string key); 
string word = Method(string key); 
boolean isTrue = Method(string key); 

Có lẽ tôi đã bỏ lỡ một cái gì đó, nhưng tôi vẫn chưa tìm thấy một cái gì đó thực sự làm điều gì đó khá như thế này. Bất kỳ và tất cả những suy nghĩ về điều này được chào đón là tốt.

+2

Xin lỗi, không có điều gì trong C#. Phương thức có kiểu trả về cố định. Bạn có thể sử dụng 'object' làm kiểu trả về của bạn, nhưng bạn phải cast. – adv12

+1

Bạn sẽ phải thực hiện phương pháp chung để làm việc. Và nó sẽ kết thúc trông giống như 'string word = Phương thức (khóa)' khi bạn sử dụng nó. Bạn cũng phải làm 'bool?' Và 'int?'vì bạn muốn trả về' null' khi không tìm thấy khóa. – juharr

+0

Nếu giá trị của bạn được lưu trữ dưới dạng 'Đối tượng', bạn có thể làm giá trị' (T)'. Điều gì ngăn cản bạn khỏi phương thức 'string word = (string) (string key);', given, phương thức trả về 'object' –

Trả lời

6

Trình biên dịch không có cách nào để phân biệt giữa ba phương pháp các cuộc gọi bạn đã cung cấp, bởi vì tất cả họ đều trông giống như Method(key);

Một lựa chọn là để trả lại một object và sau đó hy vọng các mã tiêu thụ để cast nó với những gì họ muốn:

public object Method(string key) 
{ 
    if(dictionary.ContainsKey(key)) 
    { 
     var temp = dictionary[key]; 

     switch (temp.Type) 
     { 
      case "bool": 
       return Convert.ToBoolean(temp.Value); 

      case "int" 
       return Convert.ToInt(temp.Value); 

      case "string" 
       return temp.Value; 
     } 
    } 

    return "NULL"; 
} 

... 

int x = (int) Method(key); 
string word = (string) Method(key); 
bool isTrue = (bool) Method(key); 

Bạn cũng có thể sử dụng từ khóa dynamic để làm cho diễn viên tiềm ẩn:

public dynamic Method(string key) 
{ 
    if(dictionary.ContainsKey(key)) 
    { 
     var temp = dictionary[key]; 

     switch (temp.Type) 
     { 
      case "bool": 
       return Convert.ToBoolean(temp.Value); 

      case "int" 
       return Convert.ToInt(temp.Value); 

      case "string" 
       return temp.Value; 
     } 
    } 

    return "NULL"; 
} 

... 

int x = Method(key); 
string word = Method(key); 
bool isTrue = Method(key); 

Tuy nhiên, dynamic là một khái niệm rất mạnh mẽ, và nó dễ dàng cho nó để có được ra khỏi tay, vì vậy bạn phải thực sự cẩn thận với điều đó.

Dường như với tôi rằng bạn đang mong đợi mã gọi điện thoại của bạn để biết loại đối tượng mà nó mong đợi nhận được cho mỗi khóa. Có vẻ như cách tiếp cận tốt nhất là chỉ cho phép người dùng cung cấp thông tin đó:

public T Method<T>(string key) 
{ 
    if(dictionary.ContainsKey(key)) 
     return (T) Convert.ChangeType(dictionary[key].Value, typeof(T)); 
    return default(T); 
} 

... 

int x = Method<int>(key); 
string word = Method<string>(key); 
bool isTrue = Method<bool>(key); 

Bằng cách đó, không cần theo dõi giá trị Loại trong đối tượng từ điển của bạn ngay từ đầu.

+1

Tôi nhận ra rằng OP đã sử dụng 'boolean', nhưng trong C# nó là' bool' hoặc 'Boolean'. – juharr

+0

@juharr: Được rồi, cảm ơn. – StriplingWarrior

+0

Tương tự như vậy từ OP, 'Var' không hợp lệ trong C#, nên là' var'. –

0

Loại trả về của hàm phải được nhập. Như với bất kỳ biến hoặc hoạt động nào khác, bất kỳ loại nào được kế thừa từ kiểu được chỉ định là một giá trị trả về hợp lệ (đó là lý do tại sao đối tượng cho phép bất kỳ thứ gì làm giá trị).

Cá nhân tôi không nghĩ rằng nó rất hữu ích để làm cho một phương pháp với nhiều loại trở lại nhưng nếu bạn thực sự muốn có một phương pháp với nhiều kiểu trả về, bạn có thể sử dụng các loại dynamic trong .NET 4.0:

private static void Main(string[] args) 
    { 
     int x = Method("varName3"); 
     string word = Method("varName2"); 
     bool isTrue = Method("varName1"); 
    } 

    private static dynamic Method(string key) 
    { 
     var dictionary = new Dictionary<string, KeyValuePair<Type, object>>() 
     { 
      { "varName1", new KeyValuePair<Type, object>(typeof(bool), false) }, 
      { "varName2", new KeyValuePair<Type, object>(typeof(string), "str") }, 
      { "varName3", new KeyValuePair<Type, object>(typeof(int), 5) }, 
     }; 

     if (dictionary.ContainsKey(key)) 
     { 
      return dictionary[key].Value; 
     } 

     return null; 
    } 

Hy vọng nó sẽ giúp

+0

Giúp tuyệt vời, nhưng tôi không may bị giới hạn ở khung 3.5. Bối cảnh: Đây là một công cụ cho những người sử dụng Unity. –

+0

Nếu bạn bị giới hạn ở .NET 3.5, tôi sẽ cố gắng làm cho phương thức chung: int x = Phương thức ("varName3"); Vui lòng xem câu trả lời của StriplingWarrior. – Sneijder

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