DynamicObject.TryInvokeMember(InvokeMemberBinder, Object[], Object) Metod
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Tillhandahåller implementeringen för åtgärder som anropar en medlem. Klasser som härleds från klassen kan åsidosätta den DynamicObject här metoden för att ange dynamiskt beteende för åtgärder som att anropa en metod.
public:
virtual bool TryInvokeMember(System::Dynamic::InvokeMemberBinder ^ binder, cli::array <System::Object ^> ^ args, [Runtime::InteropServices::Out] System::Object ^ % result);
public virtual bool TryInvokeMember(System.Dynamic.InvokeMemberBinder binder, object[] args, out object result);
public virtual bool TryInvokeMember(System.Dynamic.InvokeMemberBinder binder, object?[]? args, out object? result);
abstract member TryInvokeMember : System.Dynamic.InvokeMemberBinder * obj[] * obj -> bool
override this.TryInvokeMember : System.Dynamic.InvokeMemberBinder * obj[] * obj -> bool
Public Overridable Function TryInvokeMember (binder As InvokeMemberBinder, args As Object(), ByRef result As Object) As Boolean
Parametrar
- binder
- InvokeMemberBinder
Innehåller information om den dynamiska åtgärden. Egenskapen binder.Name innehåller namnet på medlemmen där den dynamiska åtgärden utförs. För instruktionen sampleObject.SampleMethod(100), där sampleObject är en instans av klassen som härleds från DynamicObject klassen, binder.Name returnerar till exempel "SampleMethod". Egenskapen binder.IgnoreCase anger om medlemsnamnet är skiftlägeskänsligt.
- args
- Object[]
Argumenten som skickas till objektmedlemmen under anropsåtgärden. För instruktionen sampleObject.SampleMethod(100), där sampleObject härleds från DynamicObject klassen, args[0] är till exempel lika med 100.
- result
- Object
Resultatet av medlemsanropet.
Returer
trueom åtgärden lyckas. annars . false Om den här metoden returnerar falseavgör körningsbindaren för språket beteendet. (I de flesta fall utlöses ett språkspecifikt körningsfel.)
Exempel
Anta att du vill ange en alternativ syntax för att komma åt värden i en ordlista, så att du i stället för att skriva sampleDictionary["Text"] = "Sample text" (sampleDictionary("Text") = "Sample text" i Visual Basic) kan skriva sampleDictionary.Text = "Sample text". Du vill också kunna anropa alla standardordlistemetoder i den här ordlistan.
I följande kodexempel visas DynamicDictionary klassen, som härleds från DynamicObject klassen. Klassen DynamicDictionary innehåller ett objekt av typen Dictionary<string, object> (Dictionary(Of String, Object) i Visual Basic) för att lagra nyckel/värde-paren. Den åsidosätter TryInvokeMember metoden för att stödja metoder för Dictionary<TKey,TValue> klassen och åsidosätter TrySetMember metoderna och TryGetMember för att stödja den nya syntaxen. Den innehåller också en Print metod som skriver ut alla ordlistenycklar och -värden.
// Add using System.Reflection;
// to the beginning of the file.
// The class derived from DynamicObject.
public class DynamicDictionary : DynamicObject
{
// The inner dictionary.
Dictionary<string, object> dictionary
= new Dictionary<string, object>();
// Getting a property.
public override bool TryGetMember(
GetMemberBinder binder, out object result)
{
return dictionary.TryGetValue(binder.Name, out result);
}
// Setting a property.
public override bool TrySetMember(
SetMemberBinder binder, object value)
{
dictionary[binder.Name] = value;
return true;
}
// Calling a method.
public override bool TryInvokeMember(
InvokeMemberBinder binder, object[] args, out object result)
{
Type dictType = typeof(Dictionary<string, object>);
try
{
result = dictType.InvokeMember(
binder.Name,
BindingFlags.InvokeMethod,
null, dictionary, args);
return true;
}
catch
{
result = null;
return false;
}
}
// This methods prints out dictionary elements.
public void Print()
{
foreach (var pair in dictionary)
Console.WriteLine(pair.Key + " " + pair.Value);
if (dictionary.Count == 0)
Console.WriteLine("No elements in the dictionary.");
}
}
class Program
{
static void Main(string[] args)
{
// Creating a dynamic dictionary.
dynamic person = new DynamicDictionary();
// Adding new dynamic properties.
// The TrySetMember method is called.
person.FirstName = "Ellen";
person.LastName = "Adams";
// Calling a method defined in the DynmaicDictionary class.
// The Print method is called.
person.Print();
Console.WriteLine(
"Removing all the elements from the dictionary.");
// Calling a method that is not defined in the DynamicDictionary class.
// The TryInvokeMember method is called.
person.Clear();
// Calling the Print method again.
person.Print();
// The following statement throws an exception at run time.
// There is no Sample method
// in the dictionary or in the DynamicDictionary class.
// person.Sample();
}
}
// This example has the following output:
// FirstName Ellen
// LastName Adams
// Removing all the elements from the dictionary.
// No elements in the dictionary.
' Add Imports System.Reflection
' to the beginning of the file.
' The class derived from DynamicObject.
Public Class DynamicDictionary
Inherits DynamicObject
' The inner dictionary.
Dim dictionary As New Dictionary(Of String, Object)
' Getting a property value.
Public Overrides Function TryGetMember(
ByVal binder As System.Dynamic.GetMemberBinder,
ByRef result As Object) As Boolean
Return dictionary.TryGetValue(binder.Name, result)
End Function
' Setting a property value.
Public Overrides Function TrySetMember(
ByVal binder As System.Dynamic.SetMemberBinder,
ByVal value As Object) As Boolean
dictionary(binder.Name) = value
Return True
End Function
' Calling a method.
Public Overrides Function TryInvokeMember(
ByVal binder As System.Dynamic.InvokeMemberBinder,
ByVal args() As Object, ByRef result As Object) As Boolean
Dim dictType As Type = GetType(Dictionary(Of String, Object))
Try
result = dictType.InvokeMember(
binder.Name,
BindingFlags.InvokeMethod,
Nothing, dictionary, args)
Return True
Catch ex As Exception
result = Nothing
Return False
End Try
End Function
' This method prints out dictionary elements.
Public Sub Print()
For Each pair In dictionary
Console.WriteLine(pair.Key & " " & pair.Value)
Next
If (dictionary.Count = 0) Then
Console.WriteLine("No elements in the dictionary.")
End If
End Sub
End Class
Sub Test()
' Creating a dynamic dictionary.
Dim person As Object = New DynamicDictionary()
' Adding new dynamic properties.
' The TrySetMember method is called.
person.FirstName = "Ellen"
person.LastName = "Adams"
' Calling a method defined in the DynmaicDictionary class.
' The Print method is called.
person.Print()
Console.WriteLine(
"Removing all the elements from the dictionary.")
' Calling a method that is not defined in the DynamicDictionary class.
' The TryInvokeMember method is called.
person.Clear()
' Calling the Print method again.
person.Print()
' The following statement throws an exception at run time.
' There is no Sample method
' in the dictionary or in the DynamicDictionary class.
' person.Sample()
End Sub
' This example has the following output:
' FirstName Ellen
' LastName Adams
' Removing all the elements from the dictionary.
' No elements in the dictionary.
Kommentarer
Klasser som härleds från klassen kan åsidosätta den DynamicObject här metoden för att ange hur åtgärder som anropar en objektmedlem ska utföras för ett dynamiskt objekt. När metoden inte åsidosättas avgör körningsbindaren för språket beteendet. (I de flesta fall utlöses ett språkspecifikt körningsfel.)
Om den här metoden åsidosättas anropas den automatiskt när du utför en åtgärd som sampleObject.SampleMethod(100), där sampleObject härleds från DynamicObject klassen.
Du kan också lägga till egna metoder i klasser som härleds från DynamicObject klassen. Om du till exempel åsidosätter TryInvokeMember metoden försöker det dynamiska sändningssystemet först avgöra om den angivna metoden finns i klassen. Om den inte hittar metoden använder den implementeringen TryInvokeMember .
Den här metoden stöder ref inte och out parametrar. Alla parametrar i matrisen args skickas efter värde.