DynamicObject.TryInvoke(InvokeBinder, Object[], Object) 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
为调用对象的操作提供实现。 从 DynamicObject 类派生的类可以重写此方法,以便为诸如调用对象或委托这样的操作指定动态行为。
public:
virtual bool TryInvoke(System::Dynamic::InvokeBinder ^ binder, cli::array <System::Object ^> ^ args, [Runtime::InteropServices::Out] System::Object ^ % result);
public virtual bool TryInvoke (System.Dynamic.InvokeBinder binder, object[] args, out object result);
public virtual bool TryInvoke (System.Dynamic.InvokeBinder binder, object?[]? args, out object? result);
abstract member TryInvoke : System.Dynamic.InvokeBinder * obj[] * obj -> bool
override this.TryInvoke : System.Dynamic.InvokeBinder * obj[] * obj -> bool
Public Overridable Function TryInvoke (binder As InvokeBinder, args As Object(), ByRef result As Object) As Boolean
参数
- binder
- InvokeBinder
提供有关调用操作的信息。
- args
- Object[]
调用操作期间传递给对象的参数。 例如,对于 sampleObject(100)
运算,其中 sampleObject
派生自 DynamicObject 类, args[0]
等于 100。
- result
- Object
对象调用的结果。
返回
如果操作成功,则为 true
;否则为 false
。 如果此方法返回 false
,则该语言的运行时联编程序将决定行为。 (大多数情况下,将引发语言特定的运行时异常。)
示例
假设需要一个数据结构来存储数字的文本和数字表示形式。 你希望能够单独指定每个属性的值,并能够在单个语句中初始化所有属性。
下面的代码示例演示 DynamicNumber
派生自 类的 DynamicObject 类。 DynamicNumber
重写 方法, TryInvoke 以便一次初始化所有属性。 它还重写 TrySetMember 和 TryGetMember 方法,以启用对单个对象属性的访问。
// 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;
}
// Initializing properties with arguments' values.
public override bool TryInvoke(
InvokeBinder binder, object[] args, out object result)
{
// The invoke operation in this case takes two arguments.
// The first one is integer and the second one is string.
if ((args.Length == 2) &&
(args[0].GetType() == typeof(int)) &&
(args[1].GetType() == typeof(String)))
{
// If the property already exists,
// its value is changed.
// Otherwise, a new property is created.
if (dictionary.ContainsKey("Numeric"))
dictionary["Numeric"] = args[0];
else
dictionary.Add("Numeric", args[0]);
if (dictionary.ContainsKey("Textual"))
dictionary["Textual"] = args[1];
else
dictionary.Add("Textual", args[1]);
result = true;
return true;
}
else
{
// If the number of arguments is wrong,
// or if arguments are of the wrong type,
// the method returns false.
result = false;
return false;
}
}
}
class Program
{
static void Test(string[] args)
{
// Creating a dynamic object.
dynamic number = new DynamicNumber();
// Adding and initializing properties.
// The TrySetMember method is called.
number.Numeric = 1;
number.Textual = "One";
// Printing out the result.
// The TryGetMember method is called.
Console.WriteLine(number.Numeric + " " + number.Textual);
// Invoking an object.
// The TryInvoke method is called.
number(2, "Two");
Console.WriteLine(number.Numeric + " " + number.Textual);
// The following statement produces a run-time exception
// because in this example the method invocation
// expects two arguments.
// number(0);
}
}
// This code example produces the following output:
// 1 One
// 2 Two
注解
派生自 类的 DynamicObject 类可以重写此方法,以指定应如何对动态对象执行调用对象的操作。 当方法未重写时,语言的运行时联编程序将确定行为。 (大多数情况下,将引发运行时异常。)
如果重写了此方法,则当你具有类似于 sampleObject(100)
的操作时,会自动调用此方法,其中 sampleObject
从 类派 DynamicObject 生。
C# 支持调用对象的操作,但在 Visual Basic 中不支持。 Visual Basic 编译器永远不会发出使用此方法的代码,并且 Visual Basic 语言不支持类似 的 sampleObject(100)
语法。