Type.DeclaringMethod Свойство
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Возвращает метод MethodBase, который представляет объявляемый метод, если текущий Type представляет параметр типа универсального метода.
public:
virtual property System::Reflection::MethodBase ^ DeclaringMethod { System::Reflection::MethodBase ^ get(); };
public virtual System.Reflection.MethodBase? DeclaringMethod { get; }
public virtual System.Reflection.MethodBase DeclaringMethod { get; }
member this.DeclaringMethod : System.Reflection.MethodBase
Public Overridable ReadOnly Property DeclaringMethod As MethodBase
Значение свойства
Если текущий объект Type представляет параметр типа универсального метода, класс MethodBase, представляющий объявляемый метод; в противном случае — значение null
.
Примеры
В следующем примере кода определяется класс, имеющий универсальный метод, назначается аргумент типа методу и вызывается результирующий сконструированный универсальный метод. Здесь также отображаются сведения об определении универсального метода и созданном методе. При отображении сведений о параметрах типа определения универсального метода в методе в DisplayGenericMethodInfo
примере кода отображается значение свойства для параметра универсального DeclaringMethod типа метода.
using namespace System;
using namespace System::Reflection;
// Define a class with a generic method.
ref class Example
{
public:
generic<typename T> static void Generic(T toDisplay)
{
Console::WriteLine("\r\nHere it is: {0}", toDisplay);
}
};
void DisplayGenericMethodInfo(MethodInfo^ mi)
{
Console::WriteLine("\r\n{0}", mi);
Console::WriteLine("\tIs this a generic method definition? {0}",
mi->IsGenericMethodDefinition);
Console::WriteLine("\tIs it a generic method? {0}",
mi->IsGenericMethod);
Console::WriteLine("\tDoes it have unassigned generic parameters? {0}",
mi->ContainsGenericParameters);
// If this is a generic method, display its type arguments.
//
if (mi->IsGenericMethod)
{
array<Type^>^ typeArguments = mi->GetGenericArguments();
Console::WriteLine("\tList type arguments ({0}):",
typeArguments->Length);
for each (Type^ tParam in typeArguments)
{
// IsGenericParameter is true only for generic type
// parameters.
//
if (tParam->IsGenericParameter)
{
Console::WriteLine("\t\t{0} parameter position {1}" +
"\n\t\t declaring method: {2}",
tParam,
tParam->GenericParameterPosition,
tParam->DeclaringMethod);
}
else
{
Console::WriteLine("\t\t{0}", tParam);
}
}
}
};
void main()
{
Console::WriteLine("\r\n--- Examine a generic method.");
// Create a Type object representing class Example, and
// get a MethodInfo representing the generic method.
//
Type^ ex = Example::typeid;
MethodInfo^ mi = ex->GetMethod("Generic");
DisplayGenericMethodInfo(mi);
// Assign the int type to the type parameter of the Example
// method.
//
MethodInfo^ miConstructed = mi->MakeGenericMethod(int::typeid);
DisplayGenericMethodInfo(miConstructed);
// Invoke the method.
array<Object^>^ args = { 42 };
miConstructed->Invoke((Object^) 0, args);
// Invoke the method normally.
Example::Generic<int>(42);
// Get the generic type definition from the closed method,
// and show it's the same as the original definition.
//
MethodInfo^ miDef = miConstructed->GetGenericMethodDefinition();
Console::WriteLine("\r\nThe definition is the same: {0}",
miDef == mi);
};
/* This example produces the following output:
--- Examine a generic method.
Void Generic[T](T)
Is this a generic method definition? True
Is it a generic method? True
Does it have unassigned generic parameters? True
List type arguments (1):
T parameter position 0
declaring method: Void Generic[T](T)
Void Generic[Int32](Int32)
Is this a generic method definition? False
Is it a generic method? True
Does it have unassigned generic parameters? False
List type arguments (1):
System.Int32
Here it is: 42
Here it is: 42
The definition is the same: True
*/
using System;
using System.Reflection;
// Define a class with a generic method.
public class Example
{
public static void Generic<T>(T toDisplay)
{
Console.WriteLine("\r\nHere it is: {0}", toDisplay);
}
}
public class Test
{
public static void Main()
{
Console.WriteLine("\r\n--- Examine a generic method.");
// Create a Type object representing class Example, and
// get a MethodInfo representing the generic method.
//
Type ex = typeof(Example);
MethodInfo mi = ex.GetMethod("Generic");
DisplayGenericMethodInfo(mi);
// Assign the int type to the type parameter of the Example
// method.
//
MethodInfo miConstructed = mi.MakeGenericMethod(typeof(int));
DisplayGenericMethodInfo(miConstructed);
// Invoke the method.
object[] args = {42};
miConstructed.Invoke(null, args);
// Invoke the method normally.
Example.Generic<int>(42);
// Get the generic type definition from the closed method,
// and show it's the same as the original definition.
//
MethodInfo miDef = miConstructed.GetGenericMethodDefinition();
Console.WriteLine("\r\nThe definition is the same: {0}",
miDef == mi);
}
private static void DisplayGenericMethodInfo(MethodInfo mi)
{
Console.WriteLine("\r\n{0}", mi);
Console.WriteLine("\tIs this a generic method definition? {0}",
mi.IsGenericMethodDefinition);
Console.WriteLine("\tIs it a generic method? {0}",
mi.IsGenericMethod);
Console.WriteLine("\tDoes it have unassigned generic parameters? {0}",
mi.ContainsGenericParameters);
// If this is a generic method, display its type arguments.
//
if (mi.IsGenericMethod)
{
Type[] typeArguments = mi.GetGenericArguments();
Console.WriteLine("\tList type arguments ({0}):",
typeArguments.Length);
foreach (Type tParam in typeArguments)
{
// IsGenericParameter is true only for generic type
// parameters.
//
if (tParam.IsGenericParameter)
{
Console.WriteLine("\t\t{0} parameter position {1}" +
"\n\t\t declaring method: {2}",
tParam,
tParam.GenericParameterPosition,
tParam.DeclaringMethod);
}
else
{
Console.WriteLine("\t\t{0}", tParam);
}
}
}
}
}
/* This example produces the following output:
--- Examine a generic method.
Void Generic[T](T)
Is this a generic method definition? True
Is it a generic method? True
Does it have unassigned generic parameters? True
List type arguments (1):
T parameter position 0
declaring method: Void Generic[T](T)
Void Generic[Int32](Int32)
Is this a generic method definition? False
Is it a generic method? True
Does it have unassigned generic parameters? False
List type arguments (1):
System.Int32
Here it is: 42
Here it is: 42
The definition is the same: True
*/
open System.Reflection
// Define a class with a generic method.
type Example =
static member Generic<'T>(toDisplay: 'T) =
printfn $"\r\nHere it is: {toDisplay}"
let displayGenericMethodInfo (mi: MethodInfo) =
printfn $"\n{mi}"
printfn $"\tIs this a generic method definition? {mi.IsGenericMethodDefinition}"
printfn $"\tIs it a generic method? {mi.IsGenericMethod}"
printfn $"\tDoes it have unassigned generic parameters? {mi.ContainsGenericParameters}"
// If this is a generic method, display its type arguments.
//
if mi.IsGenericMethod then
let typeArguments = mi.GetGenericArguments()
printfn $"\tList type arguments ({typeArguments.Length}):"
for tParam in typeArguments do
// IsGenericParameter is true only for generic type
// parameters.
if tParam.IsGenericParameter then
printfn $"\t\t{tParam} parameter position {tParam.GenericParameterPosition}\n\t\t declaring method: {tParam.DeclaringMethod}"
else
printfn $"\t\t{tParam}"
printfn "\r\n--- Examine a generic method."
// Create a Type object representing class Example, and
// get a MethodInfo representing the generic method.
//
let ex = typeof<Example>
let mi = ex.GetMethod "Generic"
displayGenericMethodInfo mi
// Assign the int type to the type parameter of the Example
// method.
//
let miConstructed = mi.MakeGenericMethod typeof<int>
displayGenericMethodInfo miConstructed
// Invoke the method.
let args = [| box 42 |]
miConstructed.Invoke(null, args) |> ignore
// Invoke the method normally.
Example.Generic<int> 42
// Get the generic type definition from the closed method,
// and show it's the same as the original definition.
//
let miDef = miConstructed.GetGenericMethodDefinition()
printfn $"\r\nThe definition is the same: {miDef = mi}"
(* This example produces the following output:
--- Examine a generic method.
Void Generic[T](T)
Is this a generic method definition? True
Is it a generic method? True
Does it have unassigned generic parameters? True
List type arguments (1):
T parameter position 0
declaring method: Void Generic[T](T)
Void Generic[Int32](Int32)
Is this a generic method definition? False
Is it a generic method? True
Does it have unassigned generic parameters? False
List type arguments (1):
System.Int32
Here it is: 42
Here it is: 42
The definition is the same: True
*)
Imports System.Reflection
' Define a class with a generic method.
Public Class Example
Public Shared Sub Generic(Of T)(ByVal toDisplay As T)
Console.WriteLine(vbCrLf & "Here it is: {0}", toDisplay)
End Sub
End Class
Public Class Test
Public Shared Sub Main()
Console.WriteLine(vbCrLf & "--- Examine a generic method.")
' Create a Type object representing class Example, and
' get a MethodInfo representing the generic method.
'
Dim ex As Type = GetType(Example)
Dim mi As MethodInfo = ex.GetMethod("Generic")
DisplayGenericMethodInfo(mi)
' Assign the Integer type to the type parameter of the Example
' method.
'
Dim arguments() As Type = { GetType(Integer) }
Dim miConstructed As MethodInfo = mi.MakeGenericMethod(arguments)
DisplayGenericMethodInfo(miConstructed)
' Invoke the method.
Dim args() As Object = { 42 }
miConstructed.Invoke(Nothing, args)
' Invoke the method normally.
Example.Generic(Of Integer)(42)
' Get the generic type definition from the constructed method,
' and show that it's the same as the original definition.
'
Dim miDef As MethodInfo = miConstructed.GetGenericMethodDefinition()
Console.WriteLine(vbCrLf & "The definition is the same: {0}", _
miDef Is mi)
End Sub
Private Shared Sub DisplayGenericMethodInfo(ByVal mi As MethodInfo)
Console.WriteLine(vbCrLf & mi.ToString())
Console.WriteLine(vbTab _
& "Is this a generic method definition? {0}", _
mi.IsGenericMethodDefinition)
Console.WriteLine(vbTab & "Is it a generic method? {0}", _
mi.IsGenericMethod)
Console.WriteLine(vbTab _
& "Does it have unassigned generic parameters? {0}", _
mi.ContainsGenericParameters)
' If this is a generic method, display its type arguments.
'
If mi.IsGenericMethod Then
Dim typeArguments As Type() = mi.GetGenericArguments()
Console.WriteLine(vbTab & "List type arguments ({0}):", _
typeArguments.Length)
For Each tParam As Type In typeArguments
' IsGenericParameter is true only for generic type
' parameters.
'
If tParam.IsGenericParameter Then
Console.WriteLine(vbTab & vbTab _
& "{0} parameter position: {1}" _
& vbCrLf & vbTab & vbTab _
& " declaring method: {2}", _
tParam, _
tParam.GenericParameterPosition, _
tParam.DeclaringMethod)
Else
Console.WriteLine(vbTab & vbTab & tParam.ToString())
End If
Next tParam
End If
End Sub
End Class
' This example produces the following output:
'
'--- Examine a generic method.
'
'Void Generic[T](T)
' Is this a generic method definition? True
' Is it a generic method? True
' Does it have unassigned generic parameters? True
' List type arguments (1):
' T parameter position: 0
' declaring method: Void Generic[T](T)
'
'Void Generic[Int32](Int32)
' Is this a generic method definition? False
' Is it a generic method? True
' Does it have unassigned generic parameters? False
' List type arguments (1):
' System.Int32
'
'Here it is: 42
'
'Here it is: 42
'
'The definition is the same: True
'
Комментарии
Объявляющий метод является универсальным определением метода. То есть, если DeclaringMethod не возвращает null
, то DeclaringMethod.IsGenericMethodDefinition
возвращает .true
Свойства DeclaringType и DeclaringMethod определяют определение универсального типа или определение универсального метода, в котором изначально был определен параметр универсального типа:
DeclaringMethod Если свойство возвращает MethodInfo, то MethodInfo представляет определение универсального метода, а текущий Type объект представляет параметр типа этого определения универсального метода.
DeclaringMethod Если свойство возвращает
null
, то DeclaringType свойство всегда возвращает объект, Type представляющий определение универсального типа, а текущий Type объект представляет параметр типа этого определения универсального типа.DeclaringMethod Получение свойства для типа, свойство которого IsGenericParameter является ,
false
вызывает исключение InvalidOperationException.
Объект MethodBase , возвращаемый свойством DeclaringMethod , является либо в MethodInfo случае универсального метода, либо в ConstructorInfo случае универсального конструктора.
Примечание
В платформа .NET Framework версии 2.0 универсальные конструкторы не поддерживаются.
Список неизменяемых условий для терминов, используемых в отражении универсальных типов, см. в примечаниях к описанию свойства IsGenericType.