DynamicObject.TryUnaryOperation(UnaryOperationBinder, Object) 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
단항 연산에 대한 구현을 제공합니다. DynamicObject 클래스에서 파생된 클래스로 이 메서드를 재정의하여 부정, 증가 또는 감소와 같은 연산의 동적 동작을 지정할 수 있습니다.
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
매개 변수
- binder
- UnaryOperationBinder
단항 연산에 대한 정보를 제공합니다. 속성은 binder.Operation
개체를 ExpressionType 반환합니다. 예를 들어 문에 negativeNumber = -number
대해 여기서 number
는 클래스에서 DynamicObject
파생되며 는 binder.Operation
"Negate"를 반환합니다.
- result
- Object
단항 연산의 결과입니다.
반환
작업에 성공하면 true
이고, 그렇지 않으면 false
입니다. 이 메서드가 false
를 반환하는 경우 언어의 런타임 바인더에 따라 동작이 결정됩니다. 대부분의 경우 언어별 런타임 예외가 throw됩니다.
예제
숫자의 텍스트 및 숫자 표현을 저장하기 위해 데이터 구조가 필요하고 이러한 데이터에 대한 수학 부정 연산을 정의하려고 한다고 가정합니다.
다음 코드 예제에서는 DynamicNumber
클래스에서 파생 된 클래스를 보여 줍니다 DynamicObject . DynamicNumber
는 메서드를 재정의 TryUnaryOperation 하여 수학 부정 연산을 사용하도록 설정합니다. 또한 요소에 TrySetMember 액세스할 수 있도록 및 TryGetMember 메서드를 재정의합니다.
이 예제에서는 수학 부정 연산만 지원됩니다. 와 같은 negativeNumber = +number
문을 작성하려고 하면 런타임 예외가 발생합니다.
// 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
설명
클래스에서 파생된 클래스는 이 메서드를 재정의 DynamicObject 하여 동적 개체에 대해 단항 연산을 수행하는 방법을 지정할 수 있습니다. 메서드를 재정의하지 않으면 언어의 런타임 바인더가 동작을 결정합니다. 대부분의 경우 언어별 런타임 예외가 throw됩니다.
이 메서드는 부정, 증가 또는 감소와 같은 단항 연산이 있을 때 호출됩니다. 예를 들어 메서드를 재정의 TryUnaryOperation 하는 경우 이 메서드는 와 같은 negativeNumber = -number
문에 대해 자동으로 호출됩니다. 여기서 number
는 클래스에서 DynamicObject 파생됩니다.
매개 변수의 속성을 사용하여 Operation
단항 연산의 binder
형식에 대한 정보를 가져올 수 있습니다.
동적 개체가 C# 및 Visual Basic에서만 사용되는 경우 속성은 binder.Operation
열거형의 ExpressionType 다음 값 중 하나를 가질 수 있습니다. 그러나 IronPython 또는 IronRuby와 같은 다른 언어에서는 다른 값을 가질 수 있습니다.
값 | Description | C# | Visual Basic |
---|---|---|---|
Decrement |
단항 감소 작업입니다. | a-- |
지원되지 않습니다. |
Increment |
단항 증분 작업입니다. | a++ |
지원되지 않습니다. |
Negate |
산술 부정입니다. | -a |
-a |
Not |
논리적 부정입니다. | !a |
Not a |
OnesComplement |
보완합니다. | ~a |
지원되지 않습니다. |
IsFalse |
false 조건 값입니다. | a && b |
지원되지 않습니다. |
IsTrue |
true 조건 값입니다. | a || b |
지원되지 않습니다. |
UnaryPlus |
단항 플러스. | +a |
+a |
참고
C#에서 동적 개체에 대한 (a || b
) 및 AndAlso
(a && b
) 작업을 구현 OrElse
하려면 메서드와 TryBinaryOperation 메서드를 TryUnaryOperation 모두 구현하는 것이 좋습니다.
작업은 OrElse
단항 IsTrue
연산과 이진 Or
연산으로 구성됩니다. Or
작업의 결과가 IsTrue
인 경우에만 작업이 수행됩니다false
.
작업은 AndAlso
단항 IsFalse
연산과 이진 And
연산으로 구성됩니다. And
작업의 결과가 IsFalse
인 경우에만 작업이 수행됩니다false
.
적용 대상
.NET