2011-10-19 28 views
9

Tôi có một lớp học với phương pháp tĩnh riêng với thông số tùy chọn. Làm thế nào để tôi gọi nó từ một lớp khác thông qua Reflection? Có một question tương tự, nhưng nó không giải quyết phương thức tĩnh hoặc tham số tùy chọn.Làm thế nào để thực hiện một phương pháp tĩnh riêng với các tham số tùy chọn thông qua sự phản ánh?

public class Foo { 
    private static void Bar(string key = "") { 
     // do stuff 
    } 
} 

Làm thế nào để gọi Foo.Bar("test")Foo.Bar() (ví dụ mà không đi qua các tham số tùy chọn)?

Trả lời

20

Giá trị tham số tùy chọn trong C# được biên dịch bằng cách tiêm các giá trị đó vào cuộc gọi. I E. mặc dù mã của bạn là

Foo.Bar() 

Trình biên dịch thực sự tạo ra một cuộc gọi như

Foo.Bar("") 

Khi tìm kiếm các phương pháp bạn cần phải đối xử với các thông số tùy chọn như các thông số thông thường.

var method = typeof(Foo).GetMethod("Bar", BindingFlags.Static | BindingFlags.NonPublic); 

Nếu bạn biết chính xác những gì giá trị mà bạn muốn gọi phương thức với bạn có thể làm:

method.Invoke(obj: null, parameters: new object[] { "Test" }); 

Nếu bạn chỉ có một số các thông số và muốn tôn vinh các giá trị của những cái mặc định bạn phải kiểm tra các đối tượng ParameterInfo của phương thức để xem các thông số có phải là tùy chọn hay không và những giá trị đó là gì. Ví dụ để in ra các giá trị mặc định của các tham số mà bạn có thể sử dụng đoạn mã sau:

foreach (ParameterInfo pi in method.GetParameters()) 
{ 
    if (pi.IsOptional) 
    { 
     Console.WriteLine(pi.Name + ": " + pi.DefaultValue); 
    } 
} 
+0

gì về phần phương pháp tĩnh? – AngryHacker

+0

@AngryHacker sử dụng 'BindingFlags.Static' (xem câu trả lời được cập nhật) – marcind

2

Sử dụng lớp này

public class Foo 
    { 
    private static void Bar(string key = "undefined key", string value = "undefined value") 
    { 
     Console.WriteLine(string.Format("The key is '{0}'", key)); 
     Console.WriteLine(string.Format("The value is '{0}'", value)); 
    } 
    } 

Bạn có thể sử dụng đoạn mã sau để gọi nó với các giá trị mặc định

MethodInfo mi = typeof(Foo).GetMethod("Bar", BindingFlags.NonPublic | BindingFlags.Static); 
    ParameterInfo[] pis = mi.GetParameters(); 

    object[] parameters = new object[pis.Length]; 

    for (int i = 0; i < pis.Length; i++) 
    { 
    if (pis[i].IsOptional) 
    { 
     parameters[i] = pis[i].DefaultValue; 
    } 
    } 

    mi.Invoke(null, parameters); 

Nếu phương pháp có một số tham số không bắt buộc, bạn sẽ phải chèn chúng vào mảng tham số trước khi gọi phương thức.

ví dụ

private static void Bar(int number, string key = "undefined key", string value = "undefined") 

sẽ yêu cầu bạn phải làm

parameters[0] = "23" 

Trước khi gọi

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