如何:將組件載入僅限反映的內容

僅限反映的載入內容可讓您檢查針對其他平臺或其他 .NET 版本所編譯的元件。 載入此內容的程式代碼只能檢查;無法執行。 這表示無法建立對象,因為無法執行建構函式。 因為無法執行程式代碼,因此不會自動載入相依性。 如果您需要檢查它們,則必須自行載入。

將組件載入僅限反映的載入內容

  1. 使用 ReflectionOnlyLoad(String) 方法多載來載入組件並提供其顯示名稱,或 ReflectionOnlyLoadFrom 方法來載入組件並提供其路徑。 如果組件是二進位映像,請使用 ReflectionOnlyLoad(Byte[]) 方法多載。

    注意

    您無法使用僅限反映的內容,從執行內容中版本以外的 .NET Framework 版本載入mscorlib.dll版本。

  2. 如果組件具有相依性,則 ReflectionOnlyLoad 方法不會載入它們。 如果您需要檢查它們,則必須自行載入。

  3. 判斷是否使用組件的 ReflectionOnly 屬性,將組件載入僅限反映的內容。

  4. 如果已將屬性套用至組件或組件中的類型,請使用 CustomAttributeData 類別來檢查這些屬性,確保不會嘗試在僅限反映的內容中執行程式碼。 使用 CustomAttributeData.GetCustomAttributes 方法的適當多載來取得 CustomAttributeData 物件,這些物件代表套用至組件、成員、模組或參數的屬性。

    注意

    套用至組件或其內容的屬性可能定義於組件中,或可能定義於另一個載入僅限反映內容的組件中。 沒有方法事先知道定義屬性的位置。

範例

下列程式碼範例示範如何檢查套用至載入僅限反映內容之組件的屬性。

此程式碼範例會定義具有兩個建構函式和一個屬性 (property) 的自訂屬性 (attribute)。 屬性會套用至組件、組件中宣告的類型、類型的方法,以及方法的參數。 執行時,組件會將它自己載入僅限反映的內容,並顯示已套用至它以及它所含類型和成員之自訂屬性的相關資訊。

注意

為了簡化程式碼範例,組件會載入並檢查本身。 一般來說,您不會想要找到同時載入執行內容和僅限反映內容的相同組件。

using namespace System;
using namespace System::Reflection;
using namespace System::Collections::Generic;
using namespace System::Collections::ObjectModel;

// An enumeration used by the ExampleAttribute class.
public enum class ExampleKind
{
   FirstKind, SecondKind, ThirdKind, FourthKind
};

// An example attribute. The attribute can be applied to all
// targets, from assemblies to parameters.
//
[AttributeUsage(AttributeTargets::All)]
public ref class ExampleAttribute: public Attribute
{
private:
   // Data for properties.
   ExampleKind kindValue;
   String^ noteValue;
   array<String^>^ arrayStrings;
   array<int>^ arrayNumbers;

   // Constructors. 
   void ExampleAttributeInitialize( ExampleKind initKind, array<String^>^ initStrings )
   {
      kindValue = initKind;
      arrayStrings = initStrings;
   }
public:
   ExampleAttribute()
   {
      ExampleAttributeInitialize( ExampleKind::FirstKind, nullptr );
   }
   ExampleAttribute( ExampleKind initKind )
   {
      ExampleAttributeInitialize( initKind, nullptr );
   }
   ExampleAttribute( ExampleKind initKind, array<String^>^ initStrings )
   {
      ExampleAttributeInitialize( initKind, initStrings );
   }

   // Properties. The Note and Numbers properties must be read/write, so they
   // can be used as named parameters.
   //
   property ExampleKind Kind 
   {
      ExampleKind get()
      {
         return kindValue;
      }
   }
   property array<String^>^ Strings
   {
      array<String^>^ get()
      {
         return arrayStrings;
      }
   }
   property String^ Note 
   {
      String^ get()
      {
         return noteValue;
      }

      void set( String^ value )
      {
         noteValue = value;
      }
   }
   property array<int>^ Numbers
   {
      array<int>^ get()
      {
         return arrayNumbers;
      }

      void set( array<int>^ value )
      {
         arrayNumbers = value;
      }
   }
};

// The example attribute is applied to the assembly.
[assembly:Example(ExampleKind::ThirdKind,Note="This is a note on the assembly.")];

// The example attribute is applied to the test class.
//
[Example(ExampleKind::SecondKind, 
         gcnew array<String^> { "String array argument, line 1", 
                        "String array argument, line 2", 
                        "String array argument, line 3" }, 
         Note="This is a note on the class.",
         Numbers = gcnew array<int> { 53, 57, 59 })] 
public ref class Test
{
public:
   // The example attribute is applied to a method, using the
   // parameterless constructor and supplying a named argument.
   // The attribute is also applied to the method parameter.
   //
   [Example(Note="This is a note on a method.")]
   void TestMethod( [Example] Object^ arg ){}

   // Main() gets objects representing the assembly, the test
   // type, the test method, and the method parameter. Custom
   // attribute data is displayed for each of these.
   //
   static void Main()
   {
      Assembly^ assembly = Assembly::ReflectionOnlyLoad( "Source" );
      Type^ t = assembly->GetType( "Test" );
      MethodInfo^ m = t->GetMethod( "TestMethod" );
      array<ParameterInfo^>^p = m->GetParameters();

      Console::WriteLine( "\r\nAttributes for assembly: '{0}'", assembly );
      ShowAttributeData( CustomAttributeData::GetCustomAttributes( assembly ) );
      Console::WriteLine( "\r\nAttributes for type: '{0}'", t );
      ShowAttributeData( CustomAttributeData::GetCustomAttributes( t ) );
      Console::WriteLine( "\r\nAttributes for member: '{0}'", m );
      ShowAttributeData( CustomAttributeData::GetCustomAttributes( m ) );
      Console::WriteLine( "\r\nAttributes for parameter: '{0}'", p );
      ShowAttributeData( CustomAttributeData::GetCustomAttributes( p[ 0 ] ) );
   }

private:
    static void ShowValueOrArray(CustomAttributeTypedArgument^ cata)
    {
        if (cata->Value->GetType() == ReadOnlyCollection<CustomAttributeTypedArgument>::typeid)
        {
            Console::WriteLine("         Array of '{0}':", cata->ArgumentType);

            for each (CustomAttributeTypedArgument^ cataElement in 
                (ReadOnlyCollection<CustomAttributeTypedArgument>^) cata->Value)
            {
                Console::WriteLine("             Type: '{0}'  Value: '{1}'",
                    cataElement->ArgumentType, cataElement->Value);
            }
        }
        else
        {
            Console::WriteLine( "         Type: '{0}'  Value: '{1}'",
               cata->ArgumentType, cata->Value );
        }
    }

   static void ShowAttributeData( IList< CustomAttributeData^ >^ attributes )
   {
      for each ( CustomAttributeData^ cad in attributes )
      {
         Console::WriteLine( "   {0}", cad );
         Console::WriteLine( "      Constructor: '{0}'", cad->Constructor );

         Console::WriteLine( "      Constructor arguments:" );
         for each ( CustomAttributeTypedArgument^ cata in cad->ConstructorArguments )
         {
            ShowValueOrArray(cata);
         }

         Console::WriteLine( "      Named arguments:" );
         for each ( CustomAttributeNamedArgument cana in cad->NamedArguments )
         {
            Console::WriteLine( "         MemberInfo: '{0}'", cana.MemberInfo );
            ShowValueOrArray(cana.TypedValue);
         }
      }
   }
};

int main()
{
   Test::Main();
}

/* This code example produces output similar to the following:

Attributes for assembly: 'source, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
   [System.Runtime.CompilerServices.CompilationRelaxationsAttribute((Int32)8)]
      Constructor: 'Void .ctor(Int32)'
      Constructor arguments:
         Type: 'System.Int32'  Value: '8'
      Named arguments:
   [System.Runtime.CompilerServices.RuntimeCompatibilityAttribute(WrapNonExceptionThrows = True)]
      Constructor: 'Void .ctor()'
      Constructor arguments:
      Named arguments:
         MemberInfo: 'Boolean WrapNonExceptionThrows'
         Type: 'System.Boolean'  Value: 'True'
   [ExampleAttribute((ExampleKind)2, Note = "This is a note on the assembly.")]
      Constructor: 'Void .ctor(ExampleKind)'
      Constructor arguments:
         Type: 'ExampleKind'  Value: '2'
      Named arguments:
         MemberInfo: 'System.String Note'
         Type: 'System.String'  Value: 'This is a note on the assembly.'

Attributes for type: 'Test'
   [ExampleAttribute((ExampleKind)1, new String[3] { "String array argument, line 1", "String array argument, line 2", "String array argument, line 3" }, Note = "This is a note on the class.", Numbers = new Int32[3] { 53, 57, 59 })]
      Constructor: 'Void .ctor(ExampleKind, System.String[])'
      Constructor arguments:
         Type: 'ExampleKind'  Value: '1'
         Array of 'System.String[]':
             Type: 'System.String'  Value: 'String array argument, line 1'
             Type: 'System.String'  Value: 'String array argument, line 2'
             Type: 'System.String'  Value: 'String array argument, line 3'
      Named arguments:
         MemberInfo: 'System.String Note'
         Type: 'System.String'  Value: 'This is a note on the class.'
         MemberInfo: 'Int32[] Numbers'
         Array of 'System.Int32[]':
             Type: 'System.Int32'  Value: '53'
             Type: 'System.Int32'  Value: '57'
             Type: 'System.Int32'  Value: '59'

Attributes for member: 'Void TestMethod(System.Object)'
   [ExampleAttribute(Note = "This is a note on a method.")]
      Constructor: 'Void .ctor()'
      Constructor arguments:
      Named arguments:
         MemberInfo: 'System.String Note'
         Type: 'System.String'  Value: 'This is a note on a method.'

Attributes for parameter: 'System.Object arg'
   [ExampleAttribute()]
      Constructor: 'Void .ctor()'
      Constructor arguments:
      Named arguments:
*/
using System;
using System.Reflection;
using System.Collections.Generic;
using System.Collections.ObjectModel;

// The example attribute is applied to the assembly.
[assembly:Example(ExampleKind.ThirdKind, Note="This is a note on the assembly.")]

// An enumeration used by the ExampleAttribute class.
public enum ExampleKind
{
    FirstKind,
    SecondKind,
    ThirdKind,
    FourthKind
};

// An example attribute. The attribute can be applied to all
// targets, from assemblies to parameters.
//
[AttributeUsage(AttributeTargets.All)]
public class ExampleAttribute : Attribute
{
    // Data for properties.
    private ExampleKind kindValue;
    private string noteValue;
    private string[] arrayStrings;
    private int[] arrayNumbers;

    // Constructors. The parameterless constructor (.ctor) calls
    // the constructor that specifies ExampleKind and an array of
    // strings, and supplies the default values.
    //
    public ExampleAttribute(ExampleKind initKind, string[] initStrings)
    {
        kindValue = initKind;
        arrayStrings = initStrings;
    }
    public ExampleAttribute(ExampleKind initKind) : this(initKind, null) {}
    public ExampleAttribute() : this(ExampleKind.FirstKind, null) {}

    // Properties. The Note and Numbers properties must be read/write, so they
    // can be used as named parameters.
    //
    public ExampleKind Kind { get { return kindValue; }}
    public string[] Strings { get { return arrayStrings; }}
    public string Note
    {
        get { return noteValue; }
        set { noteValue = value; }
    }
    public int[] Numbers
    {
        get { return arrayNumbers; }
        set { arrayNumbers = value; }
    }
}

// The example attribute is applied to the test class.
//
[Example(ExampleKind.SecondKind,
         new string[] { "String array argument, line 1",
                        "String array argument, line 2",
                        "String array argument, line 3" },
         Note="This is a note on the class.",
         Numbers = new int[] { 53, 57, 59 })]
public class Test
{
    // The example attribute is applied to a method, using the
    // parameterless constructor and supplying a named argument.
    // The attribute is also applied to the method parameter.
    //
    [Example(Note="This is a note on a method.")]
    public void TestMethod([Example] object arg) { }

    // Main() gets objects representing the assembly, the test
    // type, the test method, and the method parameter. Custom
    // attribute data is displayed for each of these.
    //
    public static void Main()
    {
        Assembly asm = Assembly.ReflectionOnlyLoad("Source");
        Type t = asm.GetType("Test");
        MethodInfo m = t.GetMethod("TestMethod");
        ParameterInfo[] p = m.GetParameters();

        Console.WriteLine("\r\nAttributes for assembly: '{0}'", asm);
        ShowAttributeData(CustomAttributeData.GetCustomAttributes(asm));
        Console.WriteLine("\r\nAttributes for type: '{0}'", t);
        ShowAttributeData(CustomAttributeData.GetCustomAttributes(t));
        Console.WriteLine("\r\nAttributes for member: '{0}'", m);
        ShowAttributeData(CustomAttributeData.GetCustomAttributes(m));
        Console.WriteLine("\r\nAttributes for parameter: '{0}'", p);
        ShowAttributeData(CustomAttributeData.GetCustomAttributes(p[0]));
    }

    private static void ShowAttributeData(
        IList<CustomAttributeData> attributes)
    {
        foreach( CustomAttributeData cad in attributes )
        {
            Console.WriteLine("   {0}", cad);
            Console.WriteLine("      Constructor: '{0}'", cad.Constructor);

            Console.WriteLine("      Constructor arguments:");
            foreach( CustomAttributeTypedArgument cata
                in cad.ConstructorArguments )
            {
                ShowValueOrArray(cata);
            }

            Console.WriteLine("      Named arguments:");
            foreach( CustomAttributeNamedArgument cana
                in cad.NamedArguments )
            {
                Console.WriteLine("         MemberInfo: '{0}'",
                    cana.MemberInfo);
                ShowValueOrArray(cana.TypedValue);
            }
        }
    }

    private static void ShowValueOrArray(CustomAttributeTypedArgument cata)
    {
        if (cata.Value.GetType() == typeof(ReadOnlyCollection<CustomAttributeTypedArgument>))
        {
            Console.WriteLine("         Array of '{0}':", cata.ArgumentType);

            foreach (CustomAttributeTypedArgument cataElement in
                (ReadOnlyCollection<CustomAttributeTypedArgument>) cata.Value)
            {
                Console.WriteLine("             Type: '{0}'  Value: '{1}'",
                    cataElement.ArgumentType, cataElement.Value);
            }
        }
        else
        {
            Console.WriteLine("         Type: '{0}'  Value: '{1}'",
                cata.ArgumentType, cata.Value);
        }
    }
}

/* This code example produces output similar to the following:

Attributes for assembly: 'source, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
   [System.Runtime.CompilerServices.CompilationRelaxationsAttribute((Int32)8)]
      Constructor: 'Void .ctor(Int32)'
      Constructor arguments:
         Type: 'System.Int32'  Value: '8'
      Named arguments:
   [System.Runtime.CompilerServices.RuntimeCompatibilityAttribute(WrapNonExceptionThrows = True)]
      Constructor: 'Void .ctor()'
      Constructor arguments:
      Named arguments:
         MemberInfo: 'Boolean WrapNonExceptionThrows'
         Type: 'System.Boolean'  Value: 'True'
   [ExampleAttribute((ExampleKind)2, Note = "This is a note on the assembly.")]
      Constructor: 'Void .ctor(ExampleKind)'
      Constructor arguments:
         Type: 'ExampleKind'  Value: '2'
      Named arguments:
         MemberInfo: 'System.String Note'
         Type: 'System.String'  Value: 'This is a note on the assembly.'

Attributes for type: 'Test'
   [ExampleAttribute((ExampleKind)1, new String[3] { "String array argument, line 1", "String array argument, line 2", "String array argument, line 3" }, Note = "This is a note on the class.", Numbers = new Int32[3] { 53, 57, 59 })]
      Constructor: 'Void .ctor(ExampleKind, System.String[])'
      Constructor arguments:
         Type: 'ExampleKind'  Value: '1'
         Array of 'System.String[]':
             Type: 'System.String'  Value: 'String array argument, line 1'
             Type: 'System.String'  Value: 'String array argument, line 2'
             Type: 'System.String'  Value: 'String array argument, line 3'
      Named arguments:
         MemberInfo: 'System.String Note'
         Type: 'System.String'  Value: 'This is a note on the class.'
         MemberInfo: 'Int32[] Numbers'
         Array of 'System.Int32[]':
             Type: 'System.Int32'  Value: '53'
             Type: 'System.Int32'  Value: '57'
             Type: 'System.Int32'  Value: '59'

Attributes for member: 'Void TestMethod(System.Object)'
   [ExampleAttribute(Note = "This is a note on a method.")]
      Constructor: 'Void .ctor()'
      Constructor arguments:
      Named arguments:
         MemberInfo: 'System.String Note'
         Type: 'System.String'  Value: 'This is a note on a method.'

Attributes for parameter: 'System.Object arg'
   [ExampleAttribute()]
      Constructor: 'Void .ctor()'
      Constructor arguments:
      Named arguments:
*/
Imports System.Reflection
Imports System.Collections.Generic
Imports System.Collections.ObjectModel

' The example attribute is applied to the assembly.
<Assembly: Example(ExampleKind.ThirdKind, Note:="This is a note on the assembly.")>

' An enumeration used by the ExampleAttribute class.
Public Enum ExampleKind
    FirstKind
    SecondKind
    ThirdKind
    FourthKind
End Enum

' An example attribute. The attribute can be applied to all
' targets, from assemblies to parameters.
'
<AttributeUsage(AttributeTargets.All)> _
Public Class ExampleAttribute
    Inherits Attribute

    ' Data for properties.
    Private kindValue As ExampleKind
    Private noteValue As String
    Private arrayStrings() As String
    Private arrayNumbers() As Integer

    ' Constructors. The parameterless constructor (.ctor) calls
    ' the constructor that specifies ExampleKind and an array of
    ' strings, and supplies the default values.
    '
    Public Sub New(ByVal initKind As ExampleKind, ByVal initStrings() As String)
        kindValue = initKind
        arrayStrings = initStrings
    End Sub
    Public Sub New(ByVal initKind As ExampleKind)
        Me.New(initKind, Nothing)
    End Sub
    Public Sub New()
        Me.New(ExampleKind.FirstKind, Nothing)
    End Sub

    ' Properties. The Note and Numbers properties must be read/write, so they 
    ' can be used as named parameters.
    '
    Public ReadOnly Property Kind As ExampleKind
        Get
            Return kindValue
        End Get
    End Property
    Public ReadOnly Property Strings As String()
        Get
            Return arrayStrings
        End Get
    End Property
    Public Property Note As String
        Get
            Return noteValue
        End Get
        Set
            noteValue = value
        End Set
    End Property
    Public Property Numbers As Integer()
        Get
            Return arrayNumbers
        End Get
        Set
            arrayNumbers = value
        End Set
    End Property
End Class

' The example attribute is applied to the test class.
'
<Example(ExampleKind.SecondKind, _
         New String() {"String array argument, line 1", _
                        "String array argument, line 2", _
                        "String array argument, line 3"}, _
         Note:="This is a note on the class.", _
         Numbers:=New Integer() {53, 57, 59})> _
Public Class Test
    ' The example attribute is applied to a method, using the
    ' parameterless constructor and supplying a named argument.
    ' The attribute is also applied to the method parameter.
    '
    <Example(Note:="This is a note on a method.")> _
    Public Sub TestMethod(<Example()> ByVal arg As Object)
    End Sub

    ' Sub Main gets objects representing the assembly, the test
    ' type, the test method, and the method parameter. Custom
    ' attribute data is displayed for each of these.
    '
    Public Shared Sub Main()
        Dim asm As [Assembly] = Assembly.ReflectionOnlyLoad("source")
        Dim t As Type = asm.GetType("Test")
        Dim m As MethodInfo = t.GetMethod("TestMethod")
        Dim p() As ParameterInfo = m.GetParameters()

        Console.WriteLine(vbCrLf & "Attributes for assembly: '{0}'", asm)
        ShowAttributeData(CustomAttributeData.GetCustomAttributes(asm))
        Console.WriteLine(vbCrLf & "Attributes for type: '{0}'", t)
        ShowAttributeData(CustomAttributeData.GetCustomAttributes(t))
        Console.WriteLine(vbCrLf & "Attributes for member: '{0}'", m)
        ShowAttributeData(CustomAttributeData.GetCustomAttributes(m))
        Console.WriteLine(vbCrLf & "Attributes for parameter: '{0}'", p)
        ShowAttributeData(CustomAttributeData.GetCustomAttributes(p(0)))
    End Sub

    Private Shared Sub ShowAttributeData( _
        ByVal attributes As IList(Of CustomAttributeData))

        For Each cad As CustomAttributeData _
            In CType(attributes, IEnumerable(Of CustomAttributeData))

            Console.WriteLine("   {0}", cad)
            Console.WriteLine("      Constructor: '{0}'", cad.Constructor)

            Console.WriteLine("      Constructor arguments:")
            For Each cata As CustomAttributeTypedArgument _
                In CType(cad.ConstructorArguments, IEnumerable(Of CustomAttributeTypedArgument))

                ShowValueOrArray(cata)
            Next

            Console.WriteLine("      Named arguments:")
            For Each cana As CustomAttributeNamedArgument _
                In CType(cad.NamedArguments, IEnumerable(Of CustomAttributeNamedArgument))

                Console.WriteLine("         MemberInfo: '{0}'", _
                    cana.MemberInfo)
                ShowValueOrArray(cana.TypedValue)
            Next
        Next
    End Sub

    Private Shared Sub ShowValueOrArray(ByVal cata As CustomAttributeTypedArgument)
        If cata.Value.GetType() Is GetType(ReadOnlyCollection(Of CustomAttributeTypedArgument)) Then
            Console.WriteLine("         Array of '{0}':", cata.ArgumentType)

            For Each cataElement As CustomAttributeTypedArgument In cata.Value
                Console.WriteLine("             Type: '{0}'  Value: '{1}'", _
                    cataElement.ArgumentType, cataElement.Value)
            Next
        Else
            Console.WriteLine("         Type: '{0}'  Value: '{1}'", _
                cata.ArgumentType, cata.Value)
        End If
    End Sub
End Class

' This code example produces output similar to the following:
'
'Attributes for assembly: 'source, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
'   [System.Runtime.CompilerServices.CompilationRelaxationsAttribute((Int32)8)]
'      Constructor: 'Void .ctor(Int32)'
'      Constructor arguments:
'         Type: 'System.Int32'  Value: '8'
'      Named arguments:
'   [System.Runtime.CompilerServices.RuntimeCompatibilityAttribute(WrapNonExceptionThrows = True)]
'      Constructor: 'Void .ctor()'
'      Constructor arguments:
'      Named arguments:
'         MemberInfo: 'Boolean WrapNonExceptionThrows'
'         Type: 'System.Boolean'  Value: 'True'
'   [ExampleAttribute((ExampleKind)2, Note = "This is a note on the assembly.")]
'      Constructor: 'Void .ctor(ExampleKind)'
'      Constructor arguments:
'         Type: 'ExampleKind'  Value: '2'
'      Named arguments:
'         MemberInfo: 'System.String Note'
'         Type: 'System.String'  Value: 'This is a note on the assembly.'
'
'Attributes for type: 'Test'
'   [ExampleAttribute((ExampleKind)1, new String[3] { "String array argument, line 1", "String array argument, line 2", "String array argument, line 3" }, Note = "This is a note on the class.", Numbers = new Int32[3] { 53, 57, 59 })]
'      Constructor: 'Void .ctor(ExampleKind, System.String[])'
'      Constructor arguments:
'         Type: 'ExampleKind'  Value: '1'
'         Array of 'System.String[]':
'             Type: 'System.String'  Value: 'String array argument, line 1'
'             Type: 'System.String'  Value: 'String array argument, line 2'
'             Type: 'System.String'  Value: 'String array argument, line 3'
'      Named arguments:
'         MemberInfo: 'System.String Note'
'         Type: 'System.String'  Value: 'This is a note on the class.'
'         MemberInfo: 'Int32[] Numbers'
'         Array of 'System.Int32[]':
'             Type: 'System.Int32'  Value: '53'
'             Type: 'System.Int32'  Value: '57'
'             Type: 'System.Int32'  Value: '59'
'
'Attributes for member: 'Void TestMethod(System.Object)'
'   [ExampleAttribute(Note = "This is a note on a method.")]
'      Constructor: 'Void .ctor()'
'      Constructor arguments:
'      Named arguments:
'         MemberInfo: 'System.String Note'
'         Type: 'System.String'  Value: 'This is a note on a method.'
'
'Attributes for parameter: 'System.Object arg'
'   [ExampleAttribute()]
'      Constructor: 'Void .ctor()'
'      Constructor arguments:
'      Named arguments:

另請參閱