الوصول إلى قيم الافتراضية على وسيطة
بعض اللغات (مثل Visual C + + و Microsoft Visual Basic 2005) يعتمد التعيين الافتراضي قيم الوسيطات. For مثال, the following هو a legitimate Visual Basic 2005 إعلان that has الافتراضي قيم for الثاني of the الوسيطات.
Public Sub MyMethod (a as Integer, _
Optional b as Double = 1.2, _
Optional c as Integer = 1)
You can استخدم a معلمة سمة إلى تعيين a الافتراضي معلمة القيمة.
في Visual أساسى و C++, اختياري معلمات can be omitted when the أسلوب هو called. في C# قيم must be specified for اختياري الوسيطات.
For مثال, الجميع the following Visual أساسى و C++ أمثلة are صالح calls for MyMethod.
MyMethod(10, 55.3, 12)
MyMethod(10, 1.3) ' c == 1
MyMethod(11) ' b == 1.2, c == 1
MyMethod(10, 55.3, 12);
MyMethod(10, 1.3); // c == 1
MyMethod(11); // b == 1.2, c == 1
لاسترداد الافتراضي القيمة الوسيطة استخدام الانعكاس، يحصل ParameterInfoكائن للمعلمة، ومن ثم استعادة الافتراضي الالقيمة باستخدام ParameterInfo.DefaultValueالخاصية. إذا لم يكن هناك لا الافتراضي القيمة وإرجاع الخاصية من القيمة.DBNull.
The following مثال displays the الافتراضي قيم for MyMethod إلى the console.
Dim m As MethodInfo = t.GetMethod("MyMethod")
Dim ps As ParameterInfo() = m.GetParameters()
Dim i As Integer
For i = 0 To ps.Length - 1
Console.WriteLine("Default Value == {0}", ps(i).DefaultValue)
Next i
MethodInfo m = t.GetMethod("MyMethod");
ParameterInfo[] ps = m.GetParameters();
for (int i = 0; i < ps.Length; i++)
{
Console.WriteLine("Default Value == {0}", ps[i].DefaultValue);
}
MethodInfo m = t->GetMethod("MyMethod");
ParameterInfo[] ps = m->GetParameters();
for (int i = 0; i < ps.Length; i++)
{
Console::WriteLine(S"Default Value == {0}", ps[i]->DefaultValue);
}
إلى invoke وظائف that have الوسيطات مع الافتراضي قيم, استخدم Type.Missing كـ a معلمة القيمة إلى the InvokeMember أسلوب. بما يمكن من خدمة الربط المتأخر للاستخدام الافتراضي القيمة لالقيمة المعلمة المشار إليه. If نوع.مفقود هو passed for a معلمة that has لا القيمة افتراضية, an ArgumentException هو تم طرح. It هو important إلى ملاحظة that not الجميع compilers' ربط mechanisms might respect these rules for نوع.مفقود. Some binders might not دعم this functionality, أو might treat نوع.مفقود differently. When using نوع.مفقود, the الافتراضي قيم do not have إلى be trailing.
The C# اللغة does not دعم الافتراضي الوسيطات.
The following Visual Basic 2005 مثال shows how إلى استخدم انعكاس إلى invoke وظائف that have الافتراضي الوسيطات.
Option Strict Off
Imports System
Imports System.Reflection
Public Class OptionalArg
Public Sub MyMethod (a As Integer, Optional b As Double = 1.2, Optional c As Integer=1)
Console.WriteLine("a = " & a & " b = " & b & " c = " & c)
End Sub
End Class
Module Module1
Sub Main()
Dim o As New OptionalArg
Dim t As Type
t = GetType(OptionalArg)
Dim Param As Object()= {10, 20, 30}
t.InvokeMember("MyMethod", _
BindingFlags.Public Or _
BindingFlags.Instance Or _
BindingFlags.InvokeMethod Or _
BindingFlags.OptionalParamBinding, _
Nothing, _
o, _
New Object() {10, 55.3, 12})
t.InvokeMember("MyMethod", _
BindingFlags.Public Or _
BindingFlags.Instance Or _
BindingFlags.InvokeMethod Or _
BindingFlags.OptionalParamBinding, _
Nothing, _
o, _
New Object() {10, 1.3, Type.Missing})
t.InvokeMember("MyMethod", _
BindingFlags.Public Or _
BindingFlags.Instance Or _
BindingFlags.InvokeMethod Or _
BindingFlags.OptionalParamBinding, _
Nothing, _
o, _
New Object() {10, Type.Missing, Type.Missing})
End Sub
End Module
When using the preceding technique, trailing الافتراضي الوسيطات are considered even when the caller specifies لا القيمة. This هو the most عام way إلى invoke وظائف مع الافتراضي الوسيطات.
If you are using MethodBase.Invoke إلى invoke the أسلوب, you need إلى بوضوح specify which الوسيطات are افتراضيات بواسطة passing an كائن صفيفة that يحتوي على نوع.مفقود for الجميع the معلمات that do not have قيم.