TypeBuilder.GetField Metode
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Mengembalikan bidang yang ditentukan oleh saat ini TypeBuilder.
Overload
GetField(Type, FieldInfo) |
Mengembalikan bidang dari jenis generik yang dibuat yang ditentukan yang sesuai dengan bidang yang ditentukan dari definisi jenis generik. |
GetField(String, BindingFlags) |
Mengembalikan bidang yang ditentukan oleh nama yang diberikan. |
GetField(Type, FieldInfo)
- Sumber:
- TypeBuilder.cs
- Sumber:
- RuntimeTypeBuilder.cs
- Sumber:
- TypeBuilder.cs
Mengembalikan bidang dari jenis generik yang dibuat yang ditentukan yang sesuai dengan bidang yang ditentukan dari definisi jenis generik.
public:
static System::Reflection::FieldInfo ^ GetField(Type ^ type, System::Reflection::FieldInfo ^ field);
public static System.Reflection.FieldInfo GetField (Type type, System.Reflection.FieldInfo field);
static member GetField : Type * System.Reflection.FieldInfo -> System.Reflection.FieldInfo
Public Shared Function GetField (type As Type, field As FieldInfo) As FieldInfo
Parameter
- type
- Type
Jenis generik yang dibangun yang bidangnya dikembalikan.
- field
- FieldInfo
Bidang pada definisi jenis generik , type
yang menentukan bidang type
mana yang akan dikembalikan.
Mengembalikan
Objek FieldInfo yang mewakili bidang type
yang sesuai dengan field
, yang menentukan bidang milik definisi jenis generik .type
Pengecualian
type
tidak mewakili jenis generik.
-atau-
type
bukan berjenis TypeBuilder.
-atau-
Jenis field
deklarasikan bukan definisi jenis generik.
-atau-
Jenis field
deklarasikan bukan definisi jenis generik dari type
.
Contoh
Contoh kode berikut berisi kode sumber untuk kelas generik bernama Sampel yang memiliki parameter jenis bernama T
. Kelas memiliki bidang bernama Field
, dari jenis T
, dan metode generik bernama GM
dengan parameter jenisnya sendiri, bernama U
. Metode GM
membuat instans Sample
, menggantikan parameter U
jenisnya sendiri untuk parameter Sample
jenis , dan menyimpan parameter inputnya di Field
. Kode sumber ini dikompilasi tetapi tidak digunakan; Anda dapat melihatnya dengan Ildasm.exe (Il Disassembler) dan membandingkannya dengan kode yang dipancarkan oleh kelas Example
.
Kode di kelas Example
menunjukkan penggunaan metode untuk memancarkan GetField kode generik. Metode Main
kelas Example
membuat rakitan dinamis yang berisi kelas bernama Sample
, dan menggunakan DefineGenericParameters metode untuk membuatnya generik dengan menambahkan parameter jenis bernama T
. Konstruktor tanpa parameter dan bidang bernama Field
, dari jenis T
, ditambahkan ke kelas Sample
. Metode GM
ditambahkan dan diubah menjadi metode generik dengan menggunakan MethodBuilder.DefineGenericParameters metode . Parameter jenis GM
diberi nama U
. Setelah parameter jenis ditentukan, tanda tangan GM
ditambahkan dengan menggunakan MethodBuilder.SetSignature metode . Tidak ada jenis pengembalian dan tidak ada pengubah yang diperlukan atau kustom, sehingga semua parameter metode null
ini kecuali parameterTypes
; parameterTypes
mengatur jenis parameter satu-satunya metode ke U
, parameter jenis generik metode. Isi metode membuat instans dari jenis Sample<U>
yang dibangun (Sample(Of U)
di Visual Basic), menetapkan parameter metode ke Field
, lalu mencetak nilai Field
. Metode GetField ini digunakan untuk membuat FieldInfo yang mewakili bidang jenis Sample<U>
generik yang dibangun dalam OpCodes.Stfld instruksi dan OpCodes.Ldfld .
Jenis dummy didefinisikan untuk menahan metode Main
titik masuk . Dalam isi Main
, metode statis GM
dipanggil pada jenis Sample<int>
generik yang dibangun (Sample(Of Integer)
di Visual Basic), dengan jenis String diganti untuk U
.
Saat contoh kode dijalankan, kode menyimpan rakitan yang dipancarkan sebagai TypeBuilderGetFieldExample.exe. Anda dapat menjalankan TypeBuilderGetFieldExample.exe, dan Anda dapat menggunakan Ildasm.exe (Il Disassembler) untuk membandingkan kode yang dipancarkan dengan kode untuk Sample
kelas yang dikompilasi ke dalam contoh kode itu sendiri.
using System;
using System.Reflection;
using System.Reflection.Emit;
// Compare the MSIL in this class to the MSIL
// generated by the Reflection.Emit code in class
// Example.
public class Sample<T>
{
public T Field;
public static void GM<U>(U val)
{
Sample<U> s = new Sample<U>();
s.Field = val;
Console.WriteLine(s.Field);
}
}
public class Example
{
public static void Main()
{
AppDomain myDomain = AppDomain.CurrentDomain;
AssemblyName myAsmName =
new AssemblyName("TypeBuilderGetFieldExample");
AssemblyBuilder myAssembly = myDomain.DefineDynamicAssembly(
myAsmName, AssemblyBuilderAccess.Save);
ModuleBuilder myModule = myAssembly.DefineDynamicModule(
myAsmName.Name,
myAsmName.Name + ".exe");
// Define the sample type.
TypeBuilder myType = myModule.DefineType("Sample",
TypeAttributes.Class | TypeAttributes.Public);
// Add a type parameter, making the type generic.
string[] typeParamNames = {"T"};
GenericTypeParameterBuilder[] typeParams =
myType.DefineGenericParameters(typeParamNames);
// Define a default constructor. Normally it would
// not be necessary to define the default constructor,
// but in this case it is needed for the call to
// TypeBuilder.GetConstructor, which gets the default
// constructor for the generic type constructed from
// Sample<T>, in the generic method GM<U>.
ConstructorBuilder ctor = myType.DefineDefaultConstructor(
MethodAttributes.PrivateScope | MethodAttributes.Public |
MethodAttributes.HideBySig | MethodAttributes.SpecialName |
MethodAttributes.RTSpecialName);
// Add a field of type T, with the name Field.
FieldBuilder myField = myType.DefineField("Field",
typeParams[0],
FieldAttributes.Public);
// Add a method and make it generic, with a type
// parameter named U. Note how similar this is to
// the way Sample is turned into a generic type. The
// method has no signature, because the type of its
// only parameter is U, which is not yet defined.
MethodBuilder genMethod = myType.DefineMethod("GM",
MethodAttributes.Public | MethodAttributes.Static);
string[] methodParamNames = {"U"};
GenericTypeParameterBuilder[] methodParams =
genMethod.DefineGenericParameters(methodParamNames);
// Now add a signature for genMethod, specifying U
// as the type of the parameter. There is no return value
// and no custom modifiers.
genMethod.SetSignature(null, null, null,
new Type[] { methodParams[0] }, null, null);
// Emit a method body for the generic method.
ILGenerator ilg = genMethod.GetILGenerator();
// Construct the type Sample<U> using MakeGenericType.
Type SampleOfU = myType.MakeGenericType( methodParams[0] );
// Create a local variable to store the instance of
// Sample<U>.
ilg.DeclareLocal(SampleOfU);
// Call the default constructor. Note that it is
// necessary to have the default constructor for the
// constructed generic type Sample<U>; use the
// TypeBuilder.GetConstructor method to obtain this
// constructor.
ConstructorInfo ctorOfU = TypeBuilder.GetConstructor(
SampleOfU, ctor);
ilg.Emit(OpCodes.Newobj, ctorOfU);
// Store the instance in the local variable; load it
// again, and load the parameter of genMethod.
ilg.Emit(OpCodes.Stloc_0);
ilg.Emit(OpCodes.Ldloc_0);
ilg.Emit(OpCodes.Ldarg_0);
// In order to store the value in the field of the
// instance of Sample<U>, it is necessary to have
// a FieldInfo representing the field of the
// constructed type. Use TypeBuilder.GetField to
// obtain this FieldInfo.
FieldInfo FieldOfU = TypeBuilder.GetField(
SampleOfU, myField);
// Store the value in the field.
ilg.Emit(OpCodes.Stfld, FieldOfU);
// Load the instance, load the field value, box it
// (specifying the type of the type parameter, U), and
// print it.
ilg.Emit(OpCodes.Ldloc_0);
ilg.Emit(OpCodes.Ldfld, FieldOfU);
ilg.Emit(OpCodes.Box, methodParams[0]);
MethodInfo writeLineObj =
typeof(Console).GetMethod("WriteLine",
new Type[] { typeof(object) });
ilg.EmitCall(OpCodes.Call, writeLineObj, null);
ilg.Emit(OpCodes.Ret);
// Emit an entry point method; this must be in a
// non-generic type.
TypeBuilder dummy = myModule.DefineType("Dummy",
TypeAttributes.Class | TypeAttributes.NotPublic);
MethodBuilder entryPoint = dummy.DefineMethod("Main",
MethodAttributes.Public | MethodAttributes.Static,
null, null);
ilg = entryPoint.GetILGenerator();
// In order to call the static generic method GM, it is
// necessary to create a constructed type from the
// generic type definition for Sample. This can be any
// constructed type; in this case Sample<int> is used.
Type SampleOfInt =
myType.MakeGenericType( typeof(int) );
// Next get a MethodInfo representing the static generic
// method GM on type Sample<int>.
MethodInfo SampleOfIntGM = TypeBuilder.GetMethod(SampleOfInt,
genMethod);
// Next get a MethodInfo for GM<string>, which is the
// instantiation of GM that Main calls.
MethodInfo GMOfString =
SampleOfIntGM.MakeGenericMethod( typeof(string) );
// Finally, emit the call. Push a string onto
// the stack, as the argument for the generic method.
ilg.Emit(OpCodes.Ldstr, "Hello, world!");
ilg.EmitCall(OpCodes.Call, GMOfString, null);
ilg.Emit(OpCodes.Ret);
myType.CreateType();
dummy.CreateType();
myAssembly.SetEntryPoint(entryPoint);
myAssembly.Save(myAsmName.Name + ".exe");
Console.WriteLine(myAsmName.Name + ".exe has been saved.");
}
}
Imports System.Reflection
Imports System.Reflection.Emit
' Compare the MSIL in this class to the MSIL
' generated by the Reflection.Emit code in class
' Example.
Public Class Sample(Of T)
Public Field As T
Public Shared Sub GM(Of U)(ByVal val As U)
Dim s As New Sample(Of U)
s.Field = val
Console.WriteLine(s.Field)
End Sub
End Class
Public Class Example
Public Shared Sub Main()
Dim myDomain As AppDomain = AppDomain.CurrentDomain
Dim myAsmName As New AssemblyName("TypeBuilderGetFieldExample")
Dim myAssembly As AssemblyBuilder = _
myDomain.DefineDynamicAssembly(myAsmName, _
AssemblyBuilderAccess.Save)
Dim myModule As ModuleBuilder = _
myAssembly.DefineDynamicModule(myAsmName.Name, _
myAsmName.Name & ".exe")
' Define the sample type.
Dim myType As TypeBuilder = myModule.DefineType( _
"Sample", _
TypeAttributes.Class Or TypeAttributes.Public)
' Add a type parameter, making the type generic.
Dim typeParamNames() As String = { "T" }
Dim typeParams As GenericTypeParameterBuilder() = _
myType.DefineGenericParameters(typeParamNames)
' Define a default constructor. Normally it would
' not be necessary to define the default constructor,
' but in this case it is needed for the call to
' TypeBuilder.GetConstructor, which gets the default
' constructor for the generic type constructed from
' Sample(Of T), in the generic method GM(Of U).
Dim ctor As ConstructorBuilder = _
myType.DefineDefaultConstructor( _
MethodAttributes.PrivateScope Or MethodAttributes.Public _
Or MethodAttributes.HideBySig Or MethodAttributes.SpecialName _
Or MethodAttributes.RTSpecialName)
' Add a field of type T, with the name Field.
Dim myField As FieldBuilder = myType.DefineField( _
"Field", typeParams(0), FieldAttributes.Public)
' Add a method and make it generic, with a type
' parameter named U. Note how similar this is to
' the way Sample is turned into a generic type. The
' method has no signature, because the type of its
' only parameter is U, which is not yet defined.
Dim genMethod As MethodBuilder = _
myType.DefineMethod("GM", _
MethodAttributes.Public Or MethodAttributes.Static)
Dim methodParamNames() As String = { "U" }
Dim methodParams As GenericTypeParameterBuilder() = _
genMethod.DefineGenericParameters(methodParamNames)
' Now add a signature for genMethod, specifying U
' as the type of the parameter. There is no return value
' and no custom modifiers.
genMethod.SetSignature(Nothing, Nothing, Nothing, _
New Type() { methodParams(0) }, Nothing, Nothing)
' Emit a method body for the generic method.
Dim ilg As ILGenerator = genMethod.GetILGenerator()
' Construct the type Sample(Of U) using MakeGenericType.
Dim SampleOfU As Type = _
myType.MakeGenericType(methodParams(0))
' Create a local variable to store the instance of
' Sample(Of U).
ilg.DeclareLocal(SampleOfU)
' Call the default constructor. Note that it is
' necessary to have the default constructor for the
' constructed generic type Sample(Of U); use the
' TypeBuilder.GetConstructor method to obtain this
' constructor.
Dim ctorOfU As ConstructorInfo = _
TypeBuilder.GetConstructor(SampleOfU, ctor)
ilg.Emit(OpCodes.Newobj, ctorOfU)
' Store the instance in the local variable; load it
' again, and load the parameter of genMethod.
ilg.Emit(OpCodes.Stloc_0)
ilg.Emit(OpCodes.Ldloc_0)
ilg.Emit(OpCodes.Ldarg_0)
' In order to store the value in the field of the
' instance of Sample(Of U), it is necessary to have
' a FieldInfo representing the field of the
' constructed type. Use TypeBuilder.GetField to
' obtain this FieldInfo.
Dim FieldOfU As FieldInfo = _
TypeBuilder.GetField(SampleOfU, myField)
' Store the value in the field.
ilg.Emit(OpCodes.Stfld, FieldOfU)
' Load the instance, load the field value, box it
' (specifying the type of the type parameter, U),
' and print it.
ilg.Emit(OpCodes.Ldloc_0)
ilg.Emit(OpCodes.Ldfld, FieldOfU)
ilg.Emit(OpCodes.Box, methodParams(0))
Dim writeLineObj As MethodInfo = _
GetType(Console).GetMethod("WriteLine", _
New Type() {GetType(Object)})
ilg.EmitCall(OpCodes.Call, writeLineObj, Nothing)
ilg.Emit(OpCodes.Ret)
' Emit an entry point method; this must be in a
' non-generic type.
Dim dummy As TypeBuilder = _
myModule.DefineType("Dummy", _
TypeAttributes.Class Or TypeAttributes.NotPublic)
Dim entryPoint As MethodBuilder = _
dummy.DefineMethod("Main", _
MethodAttributes.Public Or MethodAttributes.Static, _
Nothing, Nothing)
ilg = entryPoint.GetILGenerator()
' In order to call the static generic method GM, it is
' necessary to create a constructed type from the
' generic type definition for Sample. This can be ANY
' constructed type; in this case Sample(Of Integer)
' is used.
Dim SampleOfInt As Type = _
myType.MakeGenericType(GetType(Integer))
' Next get a MethodInfo representing the static generic
' method GM on type Sample(Of Integer).
Dim SampleOfIntGM As MethodInfo = _
TypeBuilder.GetMethod(SampleOfInt, genMethod)
' Next get a MethodInfo for GM(Of String), which is the
' instantiation of generic method GM that is called
' by Sub Main.
Dim GMOfString As MethodInfo = _
SampleOfIntGM.MakeGenericMethod(GetType(String))
' Finally, emit the call. Push a string onto
' the stack, as the argument for the generic method.
ilg.Emit(OpCodes.Ldstr, "Hello, world!")
ilg.EmitCall(OpCodes.Call, GMOfString, Nothing)
ilg.Emit(OpCodes.Ret)
myType.CreateType()
dummy.CreateType()
myAssembly.SetEntryPoint(entryPoint)
myAssembly.Save(myAsmName.Name & ".exe")
Console.WriteLine(myAsmName.Name & ".exe has been saved.")
End Sub
End Class
Keterangan
Metode ini GetField menyediakan cara untuk mendapatkan FieldInfo objek yang mewakili bidang dari jenis generik yang dibangun yang definisi jenis generiknya diwakili oleh TypeBuilder objek.
Misalnya, Anda memiliki TypeBuilder objek yang mewakili jenis G<T>
dalam sintaks C# (G(Of T)
di Visual Basic, generic <T> ref class G
di C++) dan FieldBuilder objek yang mewakili bidang public T F
dalam sintaks C# (Public F As T
dalam Visual Basic, public: T F
di C++) yang ditentukan oleh G<T>
. Misalkan memiliki G<T>
metode generik dengan parameter U
jenis yang membuat instans jenis G<U>
yang dibangun dan memanggil bidang F
pada instans tersebut. Untuk memancarkan panggilan fungsi, Anda memerlukan FieldInfo objek yang mewakili pada jenis yang dibangun - dengan kata lain, yang berjenis F
U
daripada jenis T
. Untuk melakukan ini, pertama-tama panggil MakeGenericType metode pada TypeBuilder objek , menentukan GenericTypeParameterBuilder objek yang mewakili U
sebagai argumen jenis. Kemudian panggil GetField metode dengan nilai MakeGenericType pengembalian metode sebagai parameter type
dan FieldBuilder objek yang mewakili F
sebagai parameter field
. Nilai yang dikembalikan adalah objek yang FieldInfo Anda butuhkan untuk memancarkan panggilan fungsi. Contoh kode menunjukkan skenario ini.
Berlaku untuk
GetField(String, BindingFlags)
- Sumber:
- TypeBuilder.cs
Mengembalikan bidang yang ditentukan oleh nama yang diberikan.
public:
override System::Reflection::FieldInfo ^ GetField(System::String ^ name, System::Reflection::BindingFlags bindingAttr);
public override System.Reflection.FieldInfo? GetField (string name, System.Reflection.BindingFlags bindingAttr);
public override System.Reflection.FieldInfo GetField (string name, System.Reflection.BindingFlags bindingAttr);
override this.GetField : string * System.Reflection.BindingFlags -> System.Reflection.FieldInfo
Public Overrides Function GetField (name As String, bindingAttr As BindingFlags) As FieldInfo
Parameter
- name
- String
Nama bidang yang akan didapatkan.
- bindingAttr
- BindingFlags
Ini harus sedikit bendera dari BindingFlags seperti dalam InvokeMethod
, NonPublic
, dan sebagainya.
Mengembalikan
Mengembalikan objek yang FieldInfo mewakili bidang yang dideklarasikan atau diwarisi oleh tipe ini dengan nama yang ditentukan dan pengubah publik atau non-publik. Jika tidak ada kecocokan maka null
dikembalikan.
Pengecualian
Metode ini tidak diimplementasikan untuk jenis yang tidak lengkap.
Keterangan
Ambil jenis menggunakan Type.GetType atau Assembly.GetType dan gunakan pantulan pada jenis yang diambil.