Прочитать на английском

Поделиться через


Type.Missing Поле

Определение

Представляет отсутствующее значение в данных объекта Type. Это поле доступно только для чтения.

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

Значение поля

Object

Примеры

В следующем примере кода показано использование Missing поля для вызова метода со своими аргументами по умолчанию.

#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;
    }
}
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

Этот код выводит следующие результаты:

a = 10 b = 55,3 c = 12

a = 10 b = 1,3 c = 1

a = 10 b = 1,2 c = 1

Комментарии

Используйте Missing поле для вызова через отражение, чтобы получить значение параметра по умолчанию. Если Missing поле передается в качестве значения параметра, а значение по умолчанию для этого параметра отсутствует, ArgumentException создается исключение.

Применяется к

См. также раздел