GenericTypeParameterBuilder.MakeByRefType 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
返回一个 Type 对象,此对象在作为引用参数传递时表示当前的泛型类型参数。
public:
override Type ^ MakeByRefType();
public override Type MakeByRefType ();
override this.MakeByRefType : unit -> Type
Public Overrides Function MakeByRefType () As Type
返回
一个 Type 对象,此对象在作为引用参数传递时表示当前的泛型类型参数。
示例
下面的代码示例创建一个动态模块、一个名为 的 Sample
抽象泛型类型,其中包含一个类型参数 T
,以及一个名为 的 TestMethod
抽象方法。
TestMethod
ref
采用类型T
为 的 ByRef
Visual Basic) 中的参数 (、指向 类型的T
指针和 数组T
。 此方法返回 的二维数组 T
。 该代码示例将动态模块保存到磁盘,因此可以使用 MSIL 反汇编程序 (Ildasm.exe) 对其进行检查。
using namespace System;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
int main()
{
// Define a dynamic assembly to contain the sample type. The
// assembly will not be run, but only saved to disk, so
// AssemblyBuilderAccess.Save is specified.
//
AppDomain^ appDomain = AppDomain::CurrentDomain;
AssemblyName^ assemblyName = gcnew
AssemblyName("MakeXxxGenericTypeParameterExample");
AssemblyBuilder^ assemblyBuilder = appDomain->DefineDynamicAssembly
(assemblyName, AssemblyBuilderAccess::Save);
// An assembly is made up of executable modules. For a single
// module assembly, the module name and file name are the
// same as the assembly name.
ModuleBuilder^ moduleBuilder = assemblyBuilder->DefineDynamicModule
(assemblyName->Name, assemblyName->Name + ".dll");
// Define the sample type.
TypeBuilder^ typeBuilder = moduleBuilder->DefineType("Sample",
TypeAttributes::Public | TypeAttributes::Abstract);
// Make the sample type a generic type, by defining a type
// parameter T. All type parameters are defined at the same
// time, by passing an array containing the type parameter
// names.
array<String^>^ typeParamNames = {"T"};
array<GenericTypeParameterBuilder^>^ typeParams =
typeBuilder->DefineGenericParameters(typeParamNames);
// Define a method that takes a ByRef argument of type T, a
// pointer to type T, and one-dimensional array of type T.
// The method returns a two-dimensional array of type T.
//
// To create this method, you need Type objects that repre-
// sent the parameter types and the return type. Use the
// MakeByRefType, MakePointerType, and MakeArrayType methods
// to create the Type objects, using the generic type para-
// meter T.
//
Type^ byRefType = typeParams[0]->MakeByRefType();
Type^ pointerType = typeParams[0]->MakePointerType();
Type^ arrayType = typeParams[0]->MakeArrayType();
Type^ twoDimArrayType = typeParams[0]->MakeArrayType(2);
// Create the array of parameter types.
array<Type^>^ parameterTypes = {byRefType, pointerType, arrayType};
// Define the abstract Test method. After you have compiled
// and run this example code, you can use ildasm.exe to open
// MakeXxxGenericTypeParameterExample.dll, examine the Sample
// type, and verify the parameter types and return type of
// the TestMethod method.
//
MethodBuilder^ methodBuilder = typeBuilder->DefineMethod("TestMethod",
MethodAttributes::Abstract | MethodAttributes::Virtual
| MethodAttributes::Public, twoDimArrayType, parameterTypes);
// Create the type and save the assembly. For a single-file
// assembly, there is only one module to store the manifest
// information in.
//
typeBuilder->CreateType();
assemblyBuilder->Save(assemblyName->Name + ".dll");
};
using System;
using System.Reflection;
using System.Reflection.Emit;
using Microsoft.VisualBasic;
public class Example
{
public static void Main()
{
// Define a dynamic assembly to contain the sample type. The
// assembly will not be run, but only saved to disk, so
// AssemblyBuilderAccess.Save is specified.
//
AppDomain myDomain = AppDomain.CurrentDomain;
AssemblyName myAsmName = new
AssemblyName("MakeXxxGenericTypeParameterExample");
AssemblyBuilder myAssembly = myDomain.DefineDynamicAssembly(
myAsmName, AssemblyBuilderAccess.Save);
// An assembly is made up of executable modules. For a single-
// module assembly, the module name and file name are the same
// as the assembly name.
//
ModuleBuilder myModule = myAssembly.DefineDynamicModule(
myAsmName.Name, myAsmName.Name + ".dll");
// Define the sample type.
TypeBuilder myType = myModule.DefineType("Sample",
TypeAttributes.Public | TypeAttributes.Abstract);
// Make the sample type a generic type, by defining a type
// parameter T. All type parameters are defined at the same
// time, by passing an array containing the type parameter
// names.
string[] typeParamNames = {"T"};
GenericTypeParameterBuilder[] typeParams =
myType.DefineGenericParameters(typeParamNames);
// Define a method that takes a ByRef argument of type T, a
// pointer to type T, and one-dimensional array of type T. The
// method returns a two-dimensional array of type T.
//
// To create this method, you need Type objects that represent the
// parameter types and the return type. Use the MakeByRefType,
// MakePointerType, and MakeArrayType methods to create the Type
// objects, using the generic type parameter T.
//
Type byRefType = typeParams[0].MakeByRefType();
Type pointerType = typeParams[0].MakePointerType();
Type arrayType = typeParams[0].MakeArrayType();
Type twoDimArrayType = typeParams[0].MakeArrayType(2);
// Create the array of parameter types.
Type[] parameterTypes = {byRefType, pointerType, arrayType};
// Define the abstract Test method. After you have compiled
// and run this example code, you can use ildasm.exe to open
// MakeXxxGenericTypeParameterExample.dll, examine the Sample
// type, and verify the parameter types and return type of
// the TestMethod method.
//
MethodBuilder myMethodBuilder = myType.DefineMethod(
"TestMethod",
MethodAttributes.Abstract | MethodAttributes.Virtual
| MethodAttributes.Public,
twoDimArrayType,
parameterTypes);
// Create the type and save the assembly. For a single-file
// assembly, there is only one module to store the manifest
// information in.
//
myType.CreateType();
myAssembly.Save(myAsmName.Name + ".dll");
}
}
Imports System.Reflection
Imports System.Reflection.Emit
Public Class Example
Public Shared Sub Main()
' Define a dynamic assembly to contain the sample type. The
' assembly will not be run, but only saved to disk, so
' AssemblyBuilderAccess.Save is specified.
'
Dim myDomain As AppDomain = AppDomain.CurrentDomain
Dim myAsmName As New AssemblyName("MakeXxxGenericTypeParameterExample")
Dim myAssembly As AssemblyBuilder = myDomain.DefineDynamicAssembly( _
myAsmName, _
AssemblyBuilderAccess.Save)
' An assembly is made up of executable modules. For a single-
' module assembly, the module name and file name are the same
' as the assembly name.
'
Dim myModule As ModuleBuilder = myAssembly.DefineDynamicModule( _
myAsmName.Name, _
myAsmName.Name & ".dll")
' Define the sample type.
Dim myType As TypeBuilder = myModule.DefineType( _
"Sample", _
TypeAttributes.Public Or TypeAttributes.Abstract)
' Make the sample type a generic type, by defining a type
' parameter T. All type parameters are defined at the same
' time, by passing an array containing the type parameter
' names.
Dim typeParamNames() As String = {"T"}
Dim typeParams() As GenericTypeParameterBuilder = _
myType.DefineGenericParameters(typeParamNames)
' Define a method that takes a ByRef argument of type T, a
' pointer to type T, and one-dimensional array of type T. The
' method returns a two-dimensional array of type T.
'
' To create this method, you need Type objects that represent the
' parameter types and the return type. Use the MakeByRefType,
' MakePointerType, and MakeArrayType methods to create the Type
' objects, using the generic type parameter T.
'
Dim byRefType As Type = typeParams(0).MakeByRefType
Dim pointerType As Type = typeParams(0).MakePointerType
Dim arrayType As Type = typeParams(0).MakeArrayType
Dim twoDimArrayType As Type = typeParams(0).MakeArrayType(2)
' Create the array of parameter types.
Dim parameterTypes() As Type = _
{byRefType, pointerType, arrayType}
' Define the abstract Test method. After you have compiled
' and run this example code, you can use ildasm.exe to open
' MakeXxxGenericTypeParameterExample.dll, examine the Sample
' type, and verify the parameter types and return type of
' the TestMethod method.
'
Dim myMethodBuilder As MethodBuilder = myType.DefineMethod( _
"TestMethod", _
MethodAttributes.Abstract Or MethodAttributes.Virtual _
Or MethodAttributes.Public, _
twoDimArrayType, _
parameterTypes)
' Create the type and save the assembly. For a single-file
' assembly, there is only one module to store the manifest
' information in.
'
myType.CreateType()
myAssembly.Save(myAsmName.Name & ".dll")
End Sub
End Class
注解
方法 MakeByRefType 提供了一种在 Visual Basic) 中为参数列表生成 ref
类型 (ByRef
的方法。