แก้ไข

แชร์ผ่าน


Type.Missing Field

Definition

Represents a missing value in the Type information. This field is read-only.

public: static initonly System::Object ^ Missing;
public static readonly object Missing;
 staticval mutable Missing : obj
Public Shared ReadOnly Missing As Object 

Field Value

Examples

The following code example shows the use of the Missing field to invoke a method with its default arguments.

#using <System.dll>

using namespace System;
using namespace System::Reflection;
using namespace System::CodeDom::Compiler;

ref class Example
{
public:
    static void Main()
    {
        // VB source for example. Not all versions of CS and CPP compilers
        // support optional arguments.
        String^ codeLines =
            "Imports System\n\n" +
            "Public Class OptionalArg\n" +
            "  Public Sub MyMethod(ByVal a As Integer, _\n" +
            "    Optional ByVal b As Double = 1.2, _\n" +
            "    Optional ByVal c As Integer = 1)\n\n" +
            "    Console.WriteLine(\"a = \" & a & \" b = \" & b & \" c = \" & c)\n" +
            "  End Sub\n" +
            "End Class\n";

        // Generate a OptionalArg instance from the source above.
        Object^ o = GenerateObjectFromSource("OptionalArg", codeLines, "VisualBasic");
        Type^ t;

        t = o->GetType();
        BindingFlags bf = BindingFlags::Public | BindingFlags::Instance |
            BindingFlags::InvokeMethod | BindingFlags::OptionalParamBinding;

        t->InvokeMember("MyMethod", bf, nullptr, o, gcnew array<Object^> {10, 55.3, 12});
        t->InvokeMember("MyMethod", bf, nullptr, o, gcnew array<Object^> {10, 1.3, Type::Missing});
        t->InvokeMember("MyMethod", bf, nullptr, o, gcnew array<Object^> {10, Type::Missing, Type::Missing});
    }

private:
    static Object^ GenerateObjectFromSource(String^ objectName,
        String^ sourceLines, String^ providerName)
    {
        Object^ genObject = nullptr;
        CodeDomProvider^ codeProvider = CodeDomProvider::CreateProvider(providerName);
        CompilerParameters^ cp = gcnew CompilerParameters();

        cp->GenerateExecutable = false;
        cp->GenerateInMemory = true;

        CompilerResults^ results =
            codeProvider->CompileAssemblyFromSource(cp, sourceLines);
        if (results->Errors->Count == 0)
        {
            genObject = results->CompiledAssembly->CreateInstance(objectName);
        }

        return genObject;
    }
};

int main()
{
    Example::Main();
}
using System;
using System.Reflection;
using System.CodeDom.Compiler;

class Example
{
    public static void Main()
    {
        // VB source for example. Not all versions of CS and CPP compilers
        // support optional arguments.
        string codeLines =
            "Imports System\n\n" +
            "Public Class OptionalArg\n" +
            "  Public Sub MyMethod(ByVal a As Integer, _\n" +
            "    Optional ByVal b As Double = 1.2, _\n" +
            "    Optional ByVal c As Integer = 1)\n\n" +
            "    Console.WriteLine(\"a = \" & a & \" b = \" & b & \" c = \" & c)\n" +
            "  End Sub\n" +
            "End Class\n";

        // Generate a OptionalArg instance from the source above.
        object o = GenerateObjectFromSource("OptionalArg", codeLines, "VisualBasic");
        Type t;

        t = o.GetType();
        BindingFlags bf = BindingFlags.Public | BindingFlags.Instance |
            BindingFlags.InvokeMethod | BindingFlags.OptionalParamBinding;

        t.InvokeMember("MyMethod", bf, null, o, new object[] {10, 55.3, 12});
        t.InvokeMember("MyMethod", bf, null, o, new object[] {10, 1.3, Type.Missing});
        t.InvokeMember("MyMethod", bf, null, o, new object[] {10, Type.Missing, Type.Missing});
    }

    private static object GenerateObjectFromSource(string objectName,
        string sourceLines, string providerName)
    {
        object genObject = null;
        CodeDomProvider codeProvider = CodeDomProvider.CreateProvider(providerName);
        CompilerParameters cp = new CompilerParameters();

        cp.GenerateExecutable = false;
        cp.GenerateInMemory = true;

        CompilerResults results =
            codeProvider.CompileAssemblyFromSource(cp, sourceLines);
        if (results.Errors.Count == 0)
        {
            genObject = results.CompiledAssembly.CreateInstance(objectName);
        }

        return genObject;
    }
}
open System
open System.Reflection
open System.CodeDom.Compiler

let generateObjectFromSource objectName (sourceLines: string) providerName =
    let codeProvider = CodeDomProvider.CreateProvider providerName
    let cp = CompilerParameters()

    cp.GenerateExecutable <- false
    cp.GenerateInMemory <- true

    let results = codeProvider.CompileAssemblyFromSource(cp, sourceLines)
    if results.Errors.Count = 0 then
        results.CompiledAssembly.CreateInstance objectName
    else 
        null


// VB source for example. Not all versions of CS and CPP compilers
// support optional arguments.
let codeLines =
    """Imports System
Public Class OptionalArg
  Public Sub MyMethod(ByVal a As Integer, _
    Optional ByVal b As Double = 1.2, _
    Optional ByVal c As Integer = 1)

    Console.WriteLine(\"a = \" & a & \" b = \" & b & \" c = \" & c)
  End Sub
End Class"""

// Generate a OptionalArg instance from the source above.
let o = generateObjectFromSource "OptionalArg" codeLines "VisualBasic"

let t = o.GetType()
let bf = BindingFlags.Public ||| BindingFlags.Instance ||| BindingFlags.InvokeMethod ||| BindingFlags.OptionalParamBinding

t.InvokeMember("MyMethod", bf, null, o, [| 10; 55.3; 12 |]) |> ignore
t.InvokeMember("MyMethod", bf, null, o, [| 10; 1.3; Type.Missing |]) |> ignore
t.InvokeMember("MyMethod", bf, null, o, [| 10; Type.Missing; Type.Missing |]) |> ignore
Imports System.Reflection

Public Class OptionalArg
    Public Sub MyMethod(ByVal a As Integer, _
        Optional ByVal b As Double = 1.2, _
        Optional ByVal c As Integer = 1)
        
        Console.WriteLine("a = " & a & " b = " & b & " c = " & c)
    End Sub
End Class

Class Example
    Public Shared Sub Main()
        Dim o As New OptionalArg()
        Dim t As Type
        t = GetType(OptionalArg)

        Dim bf As BindingFlags = _
            BindingFlags.Public Or BindingFlags.Instance Or _
            BindingFlags.InvokeMethod Or BindingFlags.OptionalParamBinding

        t.InvokeMember("MyMethod", bf, Nothing, o, New Object() {10, 55.3, 12})
        t.InvokeMember("MyMethod", bf, Nothing, o, New Object() {10, 1.3, Type.Missing})
        t.InvokeMember("MyMethod", bf, Nothing, o, New Object() {10, Type.Missing, Type.Missing})
    End Sub
End Class

This code produces the following output:

a = 10 b = 55.3 c = 12

a = 10 b = 1.3 c = 1

a = 10 b = 1.2 c = 1

Remarks

Use the Missing field for invocation through reflection to obtain the default value of a parameter. If the Missing field is passed in for a parameter value and there is no default value for that parameter, an ArgumentException is thrown.

Applies to

See also