DynamicObject.TryUnaryOperation(UnaryOperationBinder, Object) Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Zapewnia implementację operacji jednoargumentowych. Klasy pochodzące z DynamicObject klasy mogą zastąpić tę metodę w celu określenia dynamicznego zachowania operacji, takich jak negacja, przyrost lub dekrementacja.
public:
virtual bool TryUnaryOperation(System::Dynamic::UnaryOperationBinder ^ binder, [Runtime::InteropServices::Out] System::Object ^ % result);
public virtual bool TryUnaryOperation (System.Dynamic.UnaryOperationBinder binder, out object result);
public virtual bool TryUnaryOperation (System.Dynamic.UnaryOperationBinder binder, out object? result);
abstract member TryUnaryOperation : System.Dynamic.UnaryOperationBinder * obj -> bool
override this.TryUnaryOperation : System.Dynamic.UnaryOperationBinder * obj -> bool
Public Overridable Function TryUnaryOperation (binder As UnaryOperationBinder, ByRef result As Object) As Boolean
Parametry
- binder
- UnaryOperationBinder
Zawiera informacje o operacji jednoargumentowej. Właściwość binder.Operation
zwraca ExpressionType obiekt. Na przykład dla instrukcji negativeNumber = -number
, gdzie number
pochodzi z DynamicObject
klasy, binder.Operation
zwraca wartość "Negate".
- result
- Object
Wynik operacji jednoargumentowej.
Zwraca
true
jeśli operacja zakończy się pomyślnie; w przeciwnym razie , false
. Jeśli ta metoda zwróci false
wartość , powiązanie w czasie wykonywania języka określa zachowanie. (W większości przypadków zgłaszany jest wyjątek czasu wykonywania specyficzny dla języka).
Przykłady
Załóżmy, że potrzebujesz struktury danych do przechowywania tekstowych i liczbowych reprezentacji liczb i chcesz zdefiniować matematyczną operację negacji dla takich danych.
W poniższym przykładzie kodu pokazano klasę DynamicNumber
, która pochodzi z DynamicObject klasy . DynamicNumber
zastępuje metodę TryUnaryOperation , aby włączyć matematyczną operację negacji. Zastępuje również TrySetMember metody i TryGetMember w celu umożliwienia dostępu do elementów.
W tym przykładzie obsługiwana jest tylko matematyczna operacja negacji. Jeśli spróbujesz napisać instrukcję, na negativeNumber = +number
przykład , wystąpi wyjątek czasu wykonywania.
// Add using System.Linq.Expressions;
// to the beginning of the file
// The class derived from DynamicObject.
public class DynamicNumber : DynamicObject
{
// The inner dictionary to store field names and values.
Dictionary<string, object> dictionary
= new Dictionary<string, object>();
// Get the property value.
public override bool TryGetMember(
GetMemberBinder binder, out object result)
{
return dictionary.TryGetValue(binder.Name, out result);
}
// Set the property value.
public override bool TrySetMember(
SetMemberBinder binder, object value)
{
dictionary[binder.Name] = value;
return true;
}
// Perform the unary operation.
public override bool TryUnaryOperation(
UnaryOperationBinder binder, out object result)
{
// The Textual property contains
// the name of the unary operation in addition
// to the textual representaion of the number.
string resultTextual =
binder.Operation + " " +
dictionary["Textual"].ToString();
int resultNumeric;
// Determining what type of operation is being performed.
switch (binder.Operation)
{
case ExpressionType.Negate:
resultNumeric =
-(int)dictionary["Numeric"];
break;
default:
// In case of any other unary operation,
// print out the type of operation and return false,
// which means that the language should determine
// what to do.
// (Usually the language just throws an exception.)
Console.WriteLine(
binder.Operation +
": This unary operation is not implemented");
result = null;
return false;
}
dynamic finalResult = new DynamicNumber();
finalResult.Textual = resultTextual;
finalResult.Numeric = resultNumeric;
result = finalResult;
return true;
}
}
class Program
{
static void Test(string[] args)
{
// Creating the first dynamic number.
dynamic number = new DynamicNumber();
// Creating properties and setting their values
// for the dynamic number.
// The TrySetMember method is called.
number.Textual = "One";
number.Numeric = 1;
// Printing out properties. The TryGetMember method is called.
Console.WriteLine(
number.Textual + " " + number.Numeric);
dynamic negativeNumber = new DynamicNumber();
// Performing a mathematical negation.
// TryUnaryOperation is called.
negativeNumber = -number;
Console.WriteLine(
negativeNumber.Textual + " " + negativeNumber.Numeric);
// The following statement produces a run-time exception
// because the unary plus operation is not implemented.
// negativeNumber = +number;
}
}
// This code example produces the following output:
// One 1
// Negate One -1
' Add Imports System.Linq.Expressions
' to the beginning of the file.
' The class derived from DynamicObject.
Public Class DynamicNumber
Inherits DynamicObject
' The inner dictionary to store field names and values.
Dim dictionary As New Dictionary(Of String, Object)
' Get the 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
' Set the 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
' Perform the unary operation.
Public Overrides Function TryUnaryOperation(
ByVal binder As System.Dynamic.UnaryOperationBinder,
ByRef result As Object) As Boolean
' The Textual property contains the name of the unary operation
' in addition to the textual representaion of the number.
Dim resultTextual As String =
binder.Operation.ToString() & " " &
dictionary("Textual")
Dim resultNumeric As Integer
' Determining what type of operation is being performed.
Select Case binder.Operation
Case ExpressionType.Negate
resultNumeric = -CInt(dictionary("Numeric"))
Case Else
' In case of any other unary operation,
' print out the type of operation and return false,
' which means that the language should determine
' what to do.
' (Usually the language just throws an exception.)
Console.WriteLine(
binder.Operation.ToString() &
": This unary operation is not implemented")
result = Nothing
Return False
End Select
Dim finalResult As Object = New DynamicNumber()
finalResult.Textual = resultTextual
finalResult.Numeric = resultNumeric
result = finalResult
Return True
End Function
End Class
Sub Test()
' Creating the first dynamic number.
Dim number As Object = New DynamicNumber()
' Creating properties and setting their values
' for the dynamic number.
' The TrySetMember method is called.
number.Textual = "One"
number.Numeric = 1
' Printing out properties. The TryGetMember method is called.
Console.WriteLine(
number.Textual & " " & number.Numeric)
Dim negativeNumber As Object = New DynamicNumber()
' Performing a mathematical negation.
' The TryUnaryOperation is called.
negativeNumber = -number
Console.WriteLine(
negativeNumber.Textual & " " & negativeNumber.Numeric)
' The following statement produces a run-time exception
' because the unary plus operation is not implemented.
'negativeNumber = +number
End Sub
' This code example produces the following output:
' One 1
' Negate One -1
Uwagi
Klasy pochodzące z DynamicObject klasy mogą zastąpić tę metodę, aby określić sposób wykonywania operacji jednoargumentowych dla obiektu dynamicznego. Jeśli metoda nie zostanie zastąpiona, powiązanie czasu wykonywania języka określa zachowanie. (W większości przypadków zgłaszany jest wyjątek czasu wykonywania specyficzny dla języka).
Ta metoda jest wywoływana, gdy masz operacje jednoargumentowe, takie jak negacja, przyrost lub dekrementacja. Jeśli na przykład TryUnaryOperation metoda jest zastępowana, ta metoda jest automatycznie wywoływana dla instrukcji, takich jak negativeNumber = -number
, gdzie number
pochodzi z DynamicObject klasy .
Informacje o typie operacji jednoargumentowej można uzyskać przy użyciu Operation
właściwości parametru binder
.
Jeśli obiekt dynamiczny jest używany tylko w językach C# i Visual Basic, binder.Operation
właściwość może mieć jedną z następujących wartości z ExpressionType wyliczenia. Jednak w innych językach, takich jak IronPython lub IronRuby, można mieć inne wartości.
Wartość | Opis | C# | Visual Basic |
---|---|---|---|
Decrement |
Operacja dekrementacji jednoargumentowej. | a-- |
Nieobsługiwane. |
Increment |
Operacja przyrostu jednoargumentowego. | a++ |
Nieobsługiwane. |
Negate |
Negacja arytmetyczna. | -a |
-a |
Not |
Negacja logiczna. | !a |
Not a |
OnesComplement |
Uzupełniają się te. | ~a |
Nieobsługiwane. |
IsFalse |
Wartość warunku false. | a && b |
Nieobsługiwane. |
IsTrue |
Wartość warunku true. | a || b |
Nieobsługiwane. |
UnaryPlus |
Jednoargumentowy plus. | +a |
+a |
Uwaga
Aby zaimplementować OrElse
operacje (a || b
) i AndAlso
(a && b
) dla obiektów dynamicznych w języku C#, warto zaimplementować zarówno metodę TryUnaryOperation , jak i metodę TryBinaryOperation .
Operacja OrElse
składa się z operacji jednoargumentowej IsTrue
i operacji binarnej Or
. Operacja jest wykonywana Or
tylko wtedy, gdy wynikiem IsTrue
operacji jest false
.
Operacja AndAlso
składa się z operacji jednoargumentowej IsFalse
i operacji binarnej And
. Operacja jest wykonywana And
tylko wtedy, gdy wynikiem IsFalse
operacji jest false
.