2009-05-07 34 views
6

Tôi đang tự hỏi làm thế nào tôi có thể lấy các đối số đến các phương pháp của tôi trong một mảng. Hoặc chỉ lấy các giá trị của các đối số của tôi một cách linh hoạt.Capture đến giá trị đối số trong KeyValuePair Mảng

Ý nghĩa, một cuộc gọi như:

MyMethod(10, "eleven"); 

Đối với phương pháp:

void MyMethod(int Test, str Test2) {} 

sẽ giải quyết trong một mảng như:

{{"Test" => 10}, {"Test2", "eleven"}} 

Sẽ là tốt hơn nếu tôi có thể đạt được điều này với sự phản ánh .. Ex. bằng cách nào đó với StackTrace.

+0

Vâng. Bạn sẽ không nhận được chúng. Bạn sẽ chỉ nhận được tên tham số. Vì vậy, tôi nghĩ rằng sẽ không làm việc. – Kirtan

+0

@Robin: bạn có thấy triển khai của tôi để thêm đối số vào từ điển dễ dàng không? Tôi đã chỉnh sửa câu trả lời của mình. Là hữu ích không? –

Trả lời

2

lựa chọn tốt nhất của bạn là để làm điều đó với một loại vô danh, như thể hiện trong this example.

3

Tôi nghĩ, những gì bạn đang tìm kiếm không tồn tại. Gần nhất bạn có thể có là thông số:

MyMethod(params object[] args) 
{ 
    // if you have to do this, it's quite bad: 
    int intArg = (int)args[0]; 
    string stringArg = (string)arg[1]: 
} 

// call with any number (and type) of argument 
MyMethod(7, "tr"); 

Không có cách kiểm tra loại thời gian biên dịch và do đó không phải là cách xử lý tất cả các mục đích. Nhưng nếu đối số của bạn động, đây có thể là giải pháp.


Edit: có một ý tưởng:

Bạn cần phải đặt tất cả các tham số bằng tay vào một danh sách/từ điển. Bạn có thể viết một lớp helper để cho phép như sau:

MyMethod(int arg1, string arg2) 
{ 
    Arguments.Add(() => arg1); 
    Arguments.Add(() => arg2); 
    // 
} 

Các helper trông giống như

public static void Add<T>(Expression<Func<T>> expr) 
{ 
    // run the expression to get the argument value 
    object value = expr.Compile()(); 
    // get the argument name from the expression 
    string argumentName = ((MemberExpression)expr.Body).Member.Name; 

    // add it to some list: 
    argumentsDic.Add(argumentName, value); 
} 
+0

Vấn đề là tôi đang sử dụng dịch vụ web. Tôi muốn nắm bắt các đối số đến của cuộc gọi đang được thực hiện ... –

+0

Tôi đã có một ý tưởng khác ... xem phần mới trong câu trả lời của tôi. –

0

Câu hỏi Nice này (+1). Tôi nghĩ rằng đây là những gì bạn cần -

MethodBase mb = MethodBase.GetCurrentMethod(); 
ParameterInfo[] pi = mb.GetParameters(); 
+0

Nhưng bạn sẽ không nhận được các giá trị đối số, phải không? –

+1

Tôi đã thực sự đã thử điều đó. Nhưng tôi chỉ nhận được tên của các đối số, không phải là giá trị của cuộc gọi đến/hiện tại. –

+0

Stefan: Chính xác .. –

0

Một cách tôi biết (không chắc chắn nếu đó là chỉ cách ngày nay, nhưng nó đã từng là) là sử dụng lập trình hướng khía cạnh (AOP), và trong đặc biệt đánh chặn. Đó là một chút đau đớn để cuộn nó bằng tay, nhưng có những công cụ tuyệt vời mà đến để giải cứu. Một công cụ như vậy là PostSharp: http://www.postsharp.org/.

0

Kể từ khi phương pháp được sử dụng tên thông số, tại sao có thể không chỉ cư trú rõ ràng một cuốn từ điển với tên và giá trị của họ? Có ít điểm trong việc sử dụng sự phản chiếu để lấy tên của họ vì bạn đã biết chúng.

Như đã nêu, từ khóa params thể được sử dụng để xác định một phương pháp với một số biến của tham số, nhưng theo định nghĩa đó là những không tên.

Tôi không chắc chắn những gì bạn đang yêu cầu, theo cách mà bạn đã giải thích nó, làm cho bất kỳ ý nghĩa. Có lẽ bạn có thể xây dựng thêm?

0

Có thể đây không phải chính xác những gì bạn đang tìm kiếm, nhưng tôi thấy mình có thể thỏa hiệp hợp lý cho tình huống của mình bằng cách sử dụng biến thể trên phương pháp Matt Hamilton đề xuất và sử dụng tên ngầm của các tham số loại ẩn danh:

public void MyMethod(string arg1, bool arg2, int arg3, int arg4) 
{ 
    var dictionary = new PropertyDictionary(new 
    { 
     arg1, arg2, arg3, arg4 
    }); 
} 

public class PropertyDictionary : Dictionary<string, object> 
{ 
    public PropertyDictionary(object values) 
    { 
     if(values == null) 
      return; 

     foreach(PropertyDescriptor property in TypeDescriptor.GetProperties(values)) 
      Add(property.Name, property.GetValue(values); 
    } 
}  

Như tôi đã nói, nó có thể không hữu ích trong trường hợp của bạn, nhưng trong tôi (đơn vị thử nghiệm một phương pháp xử lý XML) rất hữu ích.

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