2016-11-03 13 views
5

Tôi nghĩ tôi có thể sử dụng tên toán tử C# 6 mới để xây dựng một từ điển khóa/giá trị ngầm từ một mảng params.Có thể ngụ ý tên của các tham số của một mảng params sử dụng toán tử nameof không?

Như một ví dụ, hãy xem xét các lời gọi phương thức sau đây:

string myName = "John", myAge = "33", myAddress = "Melbourne"; 
Test(myName, myAge, myAddress); 

Tôi không chắc chắn sẽ có một thực hiện thử nghiệm rằng sẽ có thể ngụ ý tên của các yếu tố, từ mảng params.

Có cách nào để thực hiện việc này chỉ bằng cách sử dụng nameof mà không phản ánh?

private static void Test(params string[] values) 
{ 
    List<string> keyValueList = new List<string>(); 

    //for(int i = 0; i < values.Length; i++) 
    foreach(var p in values) 
    { 
     //"Key" is always "p", obviously 
     Console.WriteLine($"Key: {nameof(p)}, Value: {p}"); 
    } 
} 
+3

'nameof' là một cơ sở thời gian trình biên dịch, không phải là cơ sở thời gian chạy. –

+0

Không cần 'myName',' myAge', vv để tồn tại trong IL biên dịch. Nếu nó không tồn tại, nó không thể có được. –

Trả lời

3

Không, điều đó là không thể. Bạn không có bất kỳ kiến ​​thức về các tên biến được sử dụng. Những thông tin này không được chuyển đến callee.

Bạn có thể đạt được những gì bạn muốn như thế này:

private static void Test(params string[][] values) 
{ 
    ... 
} 

public static void Main(string[] args) 
{ 
    string myName = "John", myAge = "33", myAddress = "Melbourne"; 
    Test(new string[] { nameof(myName), myName }); 
} 

Hoặc sử dụng một từ điển:

private static void Test(Dictionary<string, string> values) 
{ 
    ... 
} 

public static void Main(string[] args) 
{ 
    string myName = "John", myAge = "33", myAddress = "Melbourne"; 
    Test(new Dictionary<string, string> { { nameof(myName), myName }, { nameof(myAge), myAge} }); 
} 

Hoặc sử dụng dynamic:

private static void Test(dynamic values) 
{ 
    var dict = ((IDictionary<string, object>)values); 
} 

public static void Main(string[] args) 
{ 
    dynamic values = new ExpandoObject(); 
    values.A = "a"; 
    Test(values); 
} 

Một khả năng khác sẽ là việc sử dụng các một số Expression mà bạn chuyển vào phương thức. Ở đó bạn có thể trích xuất tên biến từ biểu thức và thực thi biểu thức cho giá trị của nó.

+0

Tôi đang sử dụng từ điển, tôi chỉ nghĩ đến việc tạo ra một tình trạng quá tải "thông minh hơn". – Veverke

+0

Được rồi, các biểu thức có thể hữu ích. Nhưng nhiều hơn như một phương sách cuối cùng tôi nghĩ. –

+0

Nếu bạn muốn sử dụng thông tin gì đó "thông minh hơn" và loại ẩn danh và chuyển đổi sang từ điển hoặc tên miền namecuộc gọi –

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