英語で読む

次の方法で共有


TypeBuilder.DefineMethod メソッド

定義

型にメソッドを追加します。

オーバーロード

DefineMethod(String, MethodAttributes, CallingConventions, Type, Type[], Type[], Type[], Type[][], Type[][])

新しいメソッドを、指定された名前、メソッドの属性、呼び出し規則、メソッドのシグニチャ、およびカスタム修飾子を持つ型に追加します。

DefineMethod(String, MethodAttributes, CallingConventions, Type, Type[])

指定された名前、メソッドの属性、呼び出し規則、およびメソッドのシグネチャを持つ新しいメソッドを型に追加します。

DefineMethod(String, MethodAttributes, CallingConventions)

新しいメソッドを、指定された名前、メソッドの属性、および呼び出し規約を持つ型に追加します。

DefineMethod(String, MethodAttributes)

新しいメソッドを、指定された名前とメソッドの属性を持つ型に追加します。

DefineMethod(String, MethodAttributes, Type, Type[])

新しいメソッドを、指定された名前、メソッドの属性、およびメソッドのシグニチャを持つ型に追加します。

DefineMethod(String, MethodAttributes, CallingConventions, Type, Type[], Type[], Type[], Type[][], Type[][])

ソース:
TypeBuilder.cs
ソース:
TypeBuilder.cs
ソース:
TypeBuilder.cs

新しいメソッドを、指定された名前、メソッドの属性、呼び出し規則、メソッドのシグニチャ、およびカスタム修飾子を持つ型に追加します。

C#
public System.Reflection.Emit.MethodBuilder DefineMethod (string name, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type? returnType, Type[]? returnTypeRequiredCustomModifiers, Type[]? returnTypeOptionalCustomModifiers, Type[]? parameterTypes, Type[][]? parameterTypeRequiredCustomModifiers, Type[][]? parameterTypeOptionalCustomModifiers);
C#
public System.Reflection.Emit.MethodBuilder DefineMethod (string name, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type returnType, Type[] returnTypeRequiredCustomModifiers, Type[] returnTypeOptionalCustomModifiers, Type[] parameterTypes, Type[][] parameterTypeRequiredCustomModifiers, Type[][] parameterTypeOptionalCustomModifiers);

パラメーター

name
String

メソッドの名前。 name に埋め込み null 値を含めることはできません。

attributes
MethodAttributes

メソッドの属性。

callingConvention
CallingConventions

メソッドの呼び出し規則。

returnType
Type

メソッドの戻り値の型。

returnTypeRequiredCustomModifiers
Type[]

メソッドの戻り値の型の IsConstなど、必須のカスタム修飾子を表す型の配列。 戻り値の型が必須のカスタム修飾子を持たない場合は、null を指定します。

returnTypeOptionalCustomModifiers
Type[]

メソッドの戻り値の型の IsConst のような、省略可能なカスタム修飾子を表す型の配列。 戻り値の型に省略可能のカスタム修飾子がない場合は、null を指定します。

parameterTypes
Type[]

メソッドのパラメーターの型。

parameterTypeRequiredCustomModifiers
Type[][]

型の配列の配列。 型の各配列は、IsConst のような、対応するパラメーターの必須のカスタム修飾子を表します。 特定のパラメーターに必須のカスタム修飾子がない場合は、型の配列の代わりに null を指定します。 どのパラメーターにも必須のカスタム修飾子がない場合は、配列の配列の代わりに null を指定します。

parameterTypeOptionalCustomModifiers
Type[][]

型の配列の配列。 型の各配列は、 IsConstのような、対応するパラメーターの省略可能なカスタム修飾子を表します。 特定のパラメーターに省略可能なカスタム修飾子がない場合は、型の配列の代わりに null を指定します。 どのパラメーターにも省略可能なカスタム修飾子がない場合は、配列の配列の代わりに null を指定します。

戻り値

新しく追加されたメソッドを表す MethodBuilder オブジェクト。

例外

name の長さが 0 です。

- または -

このメソッドの親の型がインターフェイスであり、このメソッドは仮想ではありません (Visual Basic ではOverridable )。

- または -

parameterTypeRequiredCustomModifiers または parameterTypeOptionalCustomModifiers のサイズは parameterTypes のサイズと同じではありません。

namenullです。

型は CreateType() を使用して既に作成されました。

- または -

現在の動的な型では、IsGenericType プロパティは true ですが、IsGenericTypeDefinition プロパティは false です。

注釈

カスタム修飾子を指定する必要がある場合は、このオーバーロードを使用します。 たとえば、ジェネリック型パラメーターでパラメーター型が指定されているジェネリック メソッドと同様に、メソッドの作成後にカスタム修飾子を指定する必要がある場合は、 または DefineMethod(String, MethodAttributes, CallingConventions) メソッド オーバーロードを使用DefineMethod(String, MethodAttributes)してメソッドを定義し、 メソッドをMethodBuilder.SetSignature使用してカスタム修飾子を使用してパラメーターと戻り値の型を定義できます。

適用対象

.NET 9 およびその他のバージョン
製品 バージョン
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

DefineMethod(String, MethodAttributes, CallingConventions, Type, Type[])

ソース:
TypeBuilder.cs
ソース:
TypeBuilder.cs
ソース:
TypeBuilder.cs

指定された名前、メソッドの属性、呼び出し規則、およびメソッドのシグネチャを持つ新しいメソッドを型に追加します。

C#
public System.Reflection.Emit.MethodBuilder DefineMethod (string name, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type? returnType, Type[]? parameterTypes);
C#
public System.Reflection.Emit.MethodBuilder DefineMethod (string name, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type returnType, Type[] parameterTypes);

パラメーター

name
String

メソッドの名前。 name に埋め込み null 値を含めることはできません。

attributes
MethodAttributes

メソッドの属性。

callingConvention
CallingConventions

メソッドの呼び出し規則。

returnType
Type

メソッドの戻り値の型。

parameterTypes
Type[]

メソッドのパラメーターの型。

戻り値

新しく定義したメソッドを表す MethodBuilder

例外

name の長さが 0 です。

- または -

このメソッドの親の型がインターフェイスであり、このメソッドは仮想ではありません (Visual Basic ではOverridable )。

namenullです。

型は CreateType() を使用して既に作成されました。

- または -

現在の動的な型では、IsGenericType プロパティは true ですが、IsGenericTypeDefinition プロパティは false です。

次のコード サンプルでは、 を使用 DefineMethod して、コンストラクターの特定のシグネチャと属性を動的型に設定し、MSIL 母集団に対応する MethodBuilder を返す方法を示します。

C#
using System;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;
using System.Security.Permissions;

public interface IMyInterface
{
   String HelloMethod(String parameter);
}

public class Example
{
   public static void Main()
   {
      Type myNestedClassType = CreateCallee(Thread.GetDomain());
      // Cretae an instance of 'MyNestedClass'.
      IMyInterface myInterface =
         (IMyInterface)Activator.CreateInstance(myNestedClassType);
      Console.WriteLine(myInterface.HelloMethod("Bill"));
   }

   // Create the callee transient dynamic assembly.
   private static Type CreateCallee(AppDomain myAppDomain)
   {
      AssemblyName myAssemblyName = new AssemblyName();
      myAssemblyName.Name = "Example";
      // Create the callee dynamic assembly.
      AssemblyBuilder myAssembly =
         myAppDomain.DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.Run);
      // Create a dynamic module in the callee assembly.
      ModuleBuilder myModule = myAssembly.DefineDynamicModule("EmittedModule");
      // Define a public class named "MyHelloWorld".
      TypeBuilder myHelloWorldType =
         myModule.DefineType("MyHelloWorld", TypeAttributes.Public);
      // Define a public nested class named 'MyNestedClass'.
      TypeBuilder myNestedClassType =
         myHelloWorldType.DefineNestedType("MyNestedClass",
            TypeAttributes.NestedPublic, typeof(Example),
            new Type[]{typeof(IMyInterface)});
      // Implement 'IMyInterface' interface.
      myNestedClassType.AddInterfaceImplementation(typeof(IMyInterface));
      // Define 'HelloMethod' of 'IMyInterface'.
      MethodBuilder myHelloMethod =
         myNestedClassType.DefineMethod("HelloMethod",
            MethodAttributes.Public | MethodAttributes.Virtual,
            typeof(String), new Type[]{typeof(String)});
      // Generate IL for 'GetGreeting' method.
      ILGenerator myMethodIL = myHelloMethod.GetILGenerator();
      myMethodIL.Emit(OpCodes.Ldstr, "Hi! ");
      myMethodIL.Emit(OpCodes.Ldarg_1);
      MethodInfo infoMethod =
         typeof(String).GetMethod("Concat",new Type[]{typeof(string),typeof(string)});
      myMethodIL.Emit(OpCodes.Call, infoMethod);
      myMethodIL.Emit(OpCodes.Ret);

      MethodInfo myHelloMethodInfo =
         typeof(IMyInterface).GetMethod("HelloMethod");
      // Implement 'HelloMethod' of 'IMyInterface'.
      myNestedClassType.DefineMethodOverride(myHelloMethod, myHelloMethodInfo);
      // Create 'MyHelloWorld' type.
      Type myType = myHelloWorldType.CreateType();
      // Create 'MyNestedClass' type.
      return myNestedClassType.CreateType();
   }
}

適用対象

.NET 9 およびその他のバージョン
製品 バージョン
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

DefineMethod(String, MethodAttributes, CallingConventions)

ソース:
TypeBuilder.cs
ソース:
TypeBuilder.cs
ソース:
TypeBuilder.cs

新しいメソッドを、指定された名前、メソッドの属性、および呼び出し規約を持つ型に追加します。

C#
public System.Reflection.Emit.MethodBuilder DefineMethod (string name, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention);

パラメーター

name
String

メソッドの名前。 name に埋め込み null 値を含めることはできません。

attributes
MethodAttributes

メソッドの属性。

callingConvention
CallingConventions

メソッドの呼び出し規則。

戻り値

新しく定義したメソッドを表す MethodBuilder

例外

name の長さが 0 です。

- または -

このメソッドの親の型がインターフェイスであり、このメソッドは仮想ではありません (Visual Basic では Overridable)。

namenullです。

型は CreateType() を使用して既に作成されました。

- または -

現在の動的な型では、IsGenericType プロパティは true ですが、IsGenericTypeDefinition プロパティは false です。

注釈

メソッドを定義するときにメソッドシグネチャがわからない場合は、このメソッド オーバーロードを使用します。 たとえば、ジェネリック メソッドのパラメーター型と戻り値の型は、メソッドのジェネリック型パラメーターで指定できます。これは、メソッドが型に追加された後に定義する必要があります。 メソッドのパラメーターと戻り値の型は、 メソッドを使用して後で MethodBuilder.SetSignature 設定できます。

こちらもご覧ください

適用対象

.NET 9 およびその他のバージョン
製品 バージョン
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

DefineMethod(String, MethodAttributes)

ソース:
TypeBuilder.cs
ソース:
TypeBuilder.cs
ソース:
TypeBuilder.cs

新しいメソッドを、指定された名前とメソッドの属性を持つ型に追加します。

C#
public System.Reflection.Emit.MethodBuilder DefineMethod (string name, System.Reflection.MethodAttributes attributes);

パラメーター

name
String

メソッドの名前。 name に埋め込み null 値を含めることはできません。

attributes
MethodAttributes

メソッドの属性。

戻り値

新しく定義したメソッドを表す MethodBuilder

例外

name の長さが 0 です。

- または -

このメソッドの親の型がインターフェイスであり、このメソッドは仮想ではありません (Visual Basic ではOverridable )。

namenullです。

型は CreateType() を使用して既に作成されました。

- または -

現在の動的な型では、IsGenericType プロパティは true ですが、IsGenericTypeDefinition プロパティは false です。

次のコード例では、 という名前 DemoMethod のジェネリック メソッドを定義し、そのジェネリック型パラメーターでパラメーター型と戻り値の型を指定します。 メソッドは、標準の呼び出し規則を使用して、シグネチャなしで定義されます。 メソッドは MethodBuilder.DefineGenericParameters ジェネリック メソッドを作成 DemoMethod するために使用され、新しく定義された型パラメーターがシグネチャと戻り値の型に使用されます。

このコード例は、 メソッドに対して提供されるより大きな例の DefineGenericParameters 一部です。

C#
// Define a Shared, Public method with standard calling
// conventions. Do not specify the parameter types or the
// return type, because type parameters will be used for
// those types, and the type parameters have not been
// defined yet.
MethodBuilder demoMethod = demoType.DefineMethod(
    "DemoMethod",
    MethodAttributes.Public | MethodAttributes.Static
);
C#
// Defining generic parameters for the method makes it a
// generic method. By convention, type parameters are
// single alphabetic characters. T and U are used here.
//
string[] typeParamNames = {"T", "U"};
GenericTypeParameterBuilder[] typeParameters =
    demoMethod.DefineGenericParameters(typeParamNames);

// The second type parameter is constrained to be a
// reference type.
typeParameters[1].SetGenericParameterAttributes(
    GenericParameterAttributes.ReferenceTypeConstraint);
C#
// Set parameter types for the method. The method takes
// one parameter, and its type is specified by the first
// type parameter, T.
Type[] parms = {typeParameters[0]};
demoMethod.SetParameters(parms);

// Set the return type for the method. The return type is
// specified by the second type parameter, U.
demoMethod.SetReturnType(typeParameters[1]);

注釈

メソッドを定義するときにメソッドシグネチャがわからない場合は、このメソッド オーバーロードを使用します。 たとえば、ジェネリック メソッドのパラメーター型と戻り値の型は、メソッドのジェネリック型パラメーターで指定できます。これは、メソッドが型に追加された後に定義する必要があります。 メソッドのパラメーターと戻り値の型は、 メソッドを使用して後で MethodBuilder.SetSignature 設定できます。

このメソッド オーバーロードは、 を使用して メソッドを CallingConventions.Standard定義します。 シグネチャを使用せずにメソッドを定義する必要がある場合は、別の呼び出し規則を使用して、 メソッド オーバーロードを使用します DefineMethod(String, MethodAttributes, CallingConventions)

こちらもご覧ください

適用対象

.NET 9 およびその他のバージョン
製品 バージョン
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

DefineMethod(String, MethodAttributes, Type, Type[])

ソース:
TypeBuilder.cs
ソース:
TypeBuilder.cs
ソース:
TypeBuilder.cs

新しいメソッドを、指定された名前、メソッドの属性、およびメソッドのシグニチャを持つ型に追加します。

C#
public System.Reflection.Emit.MethodBuilder DefineMethod (string name, System.Reflection.MethodAttributes attributes, Type? returnType, Type[]? parameterTypes);
C#
public System.Reflection.Emit.MethodBuilder DefineMethod (string name, System.Reflection.MethodAttributes attributes, Type returnType, Type[] parameterTypes);

パラメーター

name
String

メソッドの名前。 name に埋め込み null 値を含めることはできません。

attributes
MethodAttributes

メソッドの属性。

returnType
Type

メソッドの戻り値の型。

parameterTypes
Type[]

メソッドのパラメーターの型。

戻り値

定義されたメソッド。

例外

name の長さが 0 です。

- または -

このメソッドの親の型がインターフェイスであり、このメソッドは仮想ではありません (Visual Basic ではOverridable )。

namenullです。

型は CreateType() を使用して既に作成されました。

- または -

現在の動的な型では、IsGenericType プロパティは true ですが、IsGenericTypeDefinition プロパティは false です。

次のコード サンプルでは、 を使用 DefineMethod して、コンストラクターの特定のシグネチャと属性を動的型に設定し、MSIL 母集団に対応する MethodBuilder を返す方法を示します。

C#
using System;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;
using System.Security.Permissions;

public interface IMyInterface
{
   String HelloMethod(String parameter);
}

public class Example
{
   public static void Main()
   {
      Type myNestedClassType = CreateCallee(Thread.GetDomain());
      // Cretae an instance of 'MyNestedClass'.
      IMyInterface myInterface =
         (IMyInterface)Activator.CreateInstance(myNestedClassType);
      Console.WriteLine(myInterface.HelloMethod("Bill"));
   }

   // Create the callee transient dynamic assembly.
   private static Type CreateCallee(AppDomain myAppDomain)
   {
      AssemblyName myAssemblyName = new AssemblyName();
      myAssemblyName.Name = "Example";
      // Create the callee dynamic assembly.
      AssemblyBuilder myAssembly =
         myAppDomain.DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.Run);
      // Create a dynamic module in the callee assembly.
      ModuleBuilder myModule = myAssembly.DefineDynamicModule("EmittedModule");
      // Define a public class named "MyHelloWorld".
      TypeBuilder myHelloWorldType =
         myModule.DefineType("MyHelloWorld", TypeAttributes.Public);
      // Define a public nested class named 'MyNestedClass'.
      TypeBuilder myNestedClassType =
         myHelloWorldType.DefineNestedType("MyNestedClass",
            TypeAttributes.NestedPublic, typeof(Example),
            new Type[]{typeof(IMyInterface)});
      // Implement 'IMyInterface' interface.
      myNestedClassType.AddInterfaceImplementation(typeof(IMyInterface));
      // Define 'HelloMethod' of 'IMyInterface'.
      MethodBuilder myHelloMethod =
         myNestedClassType.DefineMethod("HelloMethod",
            MethodAttributes.Public | MethodAttributes.Virtual,
            typeof(String), new Type[]{typeof(String)});
      // Generate IL for 'GetGreeting' method.
      ILGenerator myMethodIL = myHelloMethod.GetILGenerator();
      myMethodIL.Emit(OpCodes.Ldstr, "Hi! ");
      myMethodIL.Emit(OpCodes.Ldarg_1);
      MethodInfo infoMethod =
         typeof(String).GetMethod("Concat",new Type[]{typeof(string),typeof(string)});
      myMethodIL.Emit(OpCodes.Call, infoMethod);
      myMethodIL.Emit(OpCodes.Ret);

      MethodInfo myHelloMethodInfo =
         typeof(IMyInterface).GetMethod("HelloMethod");
      // Implement 'HelloMethod' of 'IMyInterface'.
      myNestedClassType.DefineMethodOverride(myHelloMethod, myHelloMethodInfo);
      // Create 'MyHelloWorld' type.
      Type myType = myHelloWorldType.CreateType();
      // Create 'MyNestedClass' type.
      return myNestedClassType.CreateType();
   }
}

適用対象

.NET 9 およびその他のバージョン
製品 バージョン
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1