ParameterInfo.IsOptional 속성
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
이 매개 변수가 선택적 요소인지 여부를 나타내는 값을 가져옵니다.
public:
property bool IsOptional { bool get(); };
public bool IsOptional { get; }
member this.IsOptional : bool
Public ReadOnly Property IsOptional As Boolean
속성 값
매개 변수가 선택적 요소이면 true
이고, 그렇지 않으면 false
입니다.
예제
다음 예제에서는 , ParameterAttributes.Out및 특성에 대한 메서드 매개 변수를 테스트하는 ParameterAttributes.In방법을 보여 있습니다ParameterAttributes.Optional.
이 예제에는 다음을 DefineMethod
수행하는 메서드가 포함되어 있습니다.
형식을 포함하는 동적 어셈블리를
MyType
만듭니다.에 메서드를
MyMethod
추가합니다MyType
.MyMethod
에는 세 개의 매개 변수가 있습니다. 첫 번째 매개 변수는 로 정의되고, 두 번째 매개 변수는 로 정의되고, 두 ParameterAttributes.Optional번째 ParameterAttributes.Out매개 변수는 로 정의ParameterAttributes.In됩니다.를 호출 TypeBuilder.CreateType 하여 형식을 완료합니다.
를 실행한 DefineMethod
후 예제에서는 동적 어셈블리를 검색할 때까지 현재 로드된 어셈블리를 검색합니다. 어셈블리에서 로드하고 MyType
, 메서드에 MethodInfo 대한 개체를 MyMethod
가져오고, 매개 변수를 검사합니다. 이 예제에서는 , IsOut및 IsOptional 속성을 사용하여 IsIn매개 변수에 대한 정보를 표시합니다.
using namespace System;
using namespace System::Reflection;
using namespace System::Threading;
using namespace System::Reflection::Emit;
void DefineMethod()
{
AssemblyName^ myAssemblyName = gcnew AssemblyName;
myAssemblyName->Name = "MyAssembly";
// Get the assembly builder from the application domain associated with the current thread.
AssemblyBuilder^ myAssemblyBuilder = Thread::GetDomain()->DefineDynamicAssembly( myAssemblyName, AssemblyBuilderAccess::RunAndSave );
// Create a dynamic module in the assembly.
ModuleBuilder^ myModuleBuilder = myAssemblyBuilder->DefineDynamicModule( "MyModule", "MyAssembly.dll" );
// Create a type in the module.
TypeBuilder^ myTypeBuilder = myModuleBuilder->DefineType( "MyType" );
// Create a method called MyMethod.
array<Type^>^type1 = {int::typeid,short::typeid,long::typeid};
MethodBuilder^ myMethodBuilder = myTypeBuilder->DefineMethod( "MyMethod", static_cast<MethodAttributes>(MethodAttributes::Public | MethodAttributes::HideBySig | MethodAttributes::Static), String::typeid, type1 );
// Set the attributes for the parameters of the method.
// Set the attribute for the first parameter to IN.
ParameterBuilder^ myParameterBuilder = myMethodBuilder->DefineParameter( 1, ParameterAttributes::In, "MyIntParameter" );
// Set the attribute for the second parameter to OUT.
myParameterBuilder = myMethodBuilder->DefineParameter( 2, ParameterAttributes::Out, "MyShortParameter" );
// Set the attribute for the third parameter to OPTIONAL.
myParameterBuilder = myMethodBuilder->DefineParameter( 3, static_cast<ParameterAttributes>(ParameterAttributes::Optional | ParameterAttributes::HasDefault), "MyLongParameter" );
// Get the Microsoft Intermediate Language generator for the method.
ILGenerator^ myILGenerator = myMethodBuilder->GetILGenerator();
// Use the utility method to generate the MSIL instructions that print a String* to the console.
myILGenerator->EmitWriteLine( "Hello World!" );
// Generate the S"ret" MSIL instruction.
myILGenerator->Emit( OpCodes::Ret );
// End the creation of the type.
myTypeBuilder->CreateType();
}
int main()
{
// Create a dynamic assembly with a type named MyType.
DefineMethod();
// Get the assemblies currently loaded in the application domain.
array<Assembly^>^myAssemblies = Thread::GetDomain()->GetAssemblies();
Assembly^ myAssembly = nullptr;
// Get the assembly named MyAssembly.
for ( int i = 0; i < myAssemblies->Length; i++ )
if ( String::Compare( myAssemblies[ i ]->GetName( false )->Name, "MyAssembly" ) == 0 )
myAssembly = myAssemblies[ i ];
if ( myAssembly != nullptr )
{
// Get a type named MyType.
Type^ myType = myAssembly->GetType( "MyType" );
// Get a method named MyMethod from the type.
MethodBase^ myMethodBase = myType->GetMethod( "MyMethod" );
// Get the parameters associated with the method.
array<ParameterInfo^>^myParameters = myMethodBase->GetParameters();
Console::WriteLine( "\nThe method {0} has the {1} parameters :", myMethodBase, myParameters->Length );
// Print the IN, OUT and OPTIONAL attributes associated with each of the parameters.
for ( int i = 0; i < myParameters->Length; i++ )
{
if ( myParameters[ i ]->IsIn )
Console::WriteLine( "\tThe {0} parameter has the In attribute", i + 1 );
if ( myParameters[ i ]->IsOptional )
Console::WriteLine( "\tThe {0} parameter has the Optional attribute", i + 1 );
if ( myParameters[ i ]->IsOut )
Console::WriteLine( "\tThe {0} parameter has the Out attribute", i + 1 );
}
}
else
Console::WriteLine( "Could not find a assembly named 'MyAssembly' for the current application domain" );
}
using System;
using System.Reflection;
using System.Threading;
using System.Reflection.Emit;
public class ParameterInfo_IsIn_IsOut_IsOptional
{
public static void DefineMethod()
{
AssemblyName myAssemblyName = new AssemblyName();
myAssemblyName.Name = "MyAssembly";
// Get the assembly builder from the application domain associated with the current thread.
AssemblyBuilder myAssemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.RunAndSave);
// Create a dynamic module in the assembly.
ModuleBuilder myModuleBuilder = myAssemblyBuilder.DefineDynamicModule("MyModule", "MyAssembly.dll");
// Create a type in the module.
TypeBuilder myTypeBuilder = myModuleBuilder.DefineType("MyType");
// Create a method called MyMethod.
MethodBuilder myMethodBuilder = myTypeBuilder.DefineMethod("MyMethod",MethodAttributes.Public | MethodAttributes.HideBySig |
MethodAttributes.Static, typeof(string), new Type[] {typeof(int), typeof(short), typeof(long)});
// Set the attributes for the parameters of the method.
// Set the attribute for the first parameter to IN.
ParameterBuilder myParameterBuilder = myMethodBuilder.DefineParameter(1, ParameterAttributes.In, "MyIntParameter");
// Set the attribute for the second parameter to OUT.
myParameterBuilder = myMethodBuilder.DefineParameter(2, ParameterAttributes.Out, "MyShortParameter");
// Set the attribute for the third parameter to OPTIONAL.
myParameterBuilder = myMethodBuilder.DefineParameter(3, ParameterAttributes.Optional | ParameterAttributes.HasDefault, "MyLongParameter");
// Get the Microsoft Intermediate Language generator for the method.
ILGenerator myILGenerator = myMethodBuilder.GetILGenerator();
// Use the utility method to generate the MSIL instructions that print a string to the console.
myILGenerator.EmitWriteLine("Hello World!");
// Generate the "ret" MSIL instruction.
myILGenerator.Emit(OpCodes.Ret);
// End the creation of the type.
myTypeBuilder.CreateType();
}
public static void Main()
{
// Create a dynamic assembly with a type named MyType.
DefineMethod();
// Get the assemblies currently loaded in the application domain.
Assembly[] myAssemblies = Thread.GetDomain().GetAssemblies();
Assembly myAssembly = null;
// Get the assembly named MyAssembly.
for(int i = 0; i < myAssemblies.Length; i++)
if(String.Compare(myAssemblies[i].GetName(false).Name, "MyAssembly") == 0)
myAssembly = myAssemblies[i];
if(myAssembly != null)
{
// Get a type named MyType.
Type myType = myAssembly.GetType("MyType");
// Get a method named MyMethod from the type.
MethodBase myMethodBase = myType.GetMethod("MyMethod");
// Get the parameters associated with the method.
ParameterInfo[] myParameters = myMethodBase.GetParameters();
Console.WriteLine("\nThe method {0} has the {1} parameters :",
myMethodBase, myParameters.Length);
// Print the IN, OUT and OPTIONAL attributes associated with each of the parameters.
for(int i = 0; i < myParameters.Length; i++)
{
if(myParameters[i].IsIn)
Console.WriteLine("\tThe {0} parameter has the In attribute",
i + 1);
if(myParameters[i].IsOptional)
Console.WriteLine("\tThe {0} parameter has the Optional attribute",
i + 1);
if(myParameters[i].IsOut)
Console.WriteLine("\tThe {0} parameter has the Out attribute",
i + 1);
}
}
else
{
Console.WriteLine("Could not find a assembly named 'MyAssembly' for the current application domain");
}
}
}
Imports System.Reflection
Imports System.Threading
Imports System.Reflection.Emit
Public Class ParameterInfo_IsIn_IsOut_IsOptional
Public Shared Sub DefineMethod()
Dim myAssemblyName As New AssemblyName()
myAssemblyName.Name = "MyAssembly"
' Get the assesmbly builder from the application domain associated with the current thread.
Dim myAssemblyBuilder As AssemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.RunAndSave)
' Create a dynamic module in the assembly.
Dim myModuleBuilder As ModuleBuilder = myAssemblyBuilder.DefineDynamicModule("MyModule", "MyAssembly.dll")
' Create a type in the module.
Dim myTypeBuilder As TypeBuilder = myModuleBuilder.DefineType("MyType")
' Create a method called MyMethod.
Dim myMethodBuilder As MethodBuilder = myTypeBuilder.DefineMethod("MyMethod", MethodAttributes.Public Or MethodAttributes.HideBySig Or MethodAttributes.Static, GetType(String), New Type() {GetType(Integer), GetType(Short), GetType(Long)})
' Set the attributes for the parameters of the method.
' Set the attribute for the first parameter to IN.
Dim myParameterBuilder As ParameterBuilder = myMethodBuilder.DefineParameter(1, ParameterAttributes.In, "MyIntParameter")
' Set the attribute for the second parameter to OUT.
myParameterBuilder = myMethodBuilder.DefineParameter(2, ParameterAttributes.Out, "MyShortParameter")
' Set the attribute for the third parameter to OPTIONAL.
myParameterBuilder = myMethodBuilder.DefineParameter(3, ParameterAttributes.Optional Or ParameterAttributes.HasDefault, "MyLongParameter")
' Get the Microsoft Intermediate Language generator for the method.
Dim myILGenerator As ILGenerator = myMethodBuilder.GetILGenerator()
' Use the utility method to generate the MSIL instructions that print a string to the console.
myILGenerator.EmitWriteLine("Hello World!")
' Generate the "ret" MSIL instruction.
myILGenerator.Emit(OpCodes.Ret)
' End the creation of the type.
myTypeBuilder.CreateType()
End Sub
Public Shared Sub Main()
' Create a dynamic assembly with a type named 'MyType'.
DefineMethod()
' Get the assemblies currently loaded in the application domain.
Dim myAssemblies As [Assembly]() = Thread.GetDomain().GetAssemblies()
Dim myAssembly As [Assembly] = Nothing
' Get the assembly named MyAssembly.
Dim i As Integer
For i = 0 To myAssemblies.Length - 1
If [String].Compare(myAssemblies(i).GetName(False).Name, "MyAssembly") = 0 Then
myAssembly = myAssemblies(i)
End If
Next i
If Not (myAssembly Is Nothing) Then
' Get a type named MyType.
Dim myType As Type = myAssembly.GetType("MyType")
' Get a method named MyMethod from the type.
Dim myMethodBase As MethodBase = myType.GetMethod("MyMethod")
' Get the parameters associated with the method.
Dim myParameters As ParameterInfo() = myMethodBase.GetParameters()
Console.WriteLine(ControlChars.Cr + "The method {0} has the {1} parameters :", myMethodBase, myParameters.Length)
' Print the IN, OUT and OPTIONAL attributes associated with each of the parameters.
For i = 0 To myParameters.Length - 1
If myParameters(i).IsIn Then
Console.WriteLine(ControlChars.Tab + "The {0} parameter has the In attribute", i + 1)
End If
If myParameters(i).IsOptional Then
Console.WriteLine(ControlChars.Tab + "The {0} parameter has the Optional attribute", i + 1)
End If
If myParameters(i).IsOut Then
Console.WriteLine(ControlChars.Tab + "The {0} parameter has the Out attribute", i + 1)
End If
Next i
Else
Console.WriteLine("Could not find a assembly named 'MyAssembly' for the current application domain")
End If
End Sub
End Class
설명
이 메서드는 선택적 메타데이터 플래그에 따라 달라집니다. 컴파일러에서 이 플래그를 삽입할 수 있지만 컴파일러에서 이 플래그를 삽입할 의무는 없습니다.
이 메서드는 Optional
열거자의 플래그를 ParameterAttributes
활용합니다.
배열을 ParameterInfo 얻으려면 먼저 메서드를 가져와서 를 호출 MethodBase.GetParameters합니다.
적용 대상
.NET