DynamicObject.TryInvoke(InvokeBinder, Object[], Object) Metódus
Definíció
Fontos
Egyes információk olyan, kiadás előtti termékekre vonatkoznak, amelyek a kiadásig még jelentősen módosulhatnak. A Microsoft nem vállal kifejezett vagy törvényi garanciát az itt megjelenő információért.
Az objektumot meghívó műveletek implementációját biztosítja. Az osztályból származó osztályok felülbírálhatják ezt a DynamicObject metódust, hogy dinamikus viselkedést adjanak meg olyan műveletekhez, mint például egy objektum vagy egy meghatalmazott meghívása.
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
Paraméterek
- binder
- InvokeBinder
Információt nyújt a meghívási műveletről.
- args
- Object[]
A meghívási művelet során az objektumnak átadott argumentumok. Az sampleObject(100) osztályból sampleObjectDynamicObject származtatott művelet args[0] például 100-nak felel meg.
- result
- Object
Az objektumhívás eredménye.
Válaszok
trueha a művelet sikeres; egyéb esetben. false Ha ez a metódus visszatér false, a nyelv futásidejű kötése határozza meg a viselkedést. (A legtöbb esetben a rendszer nyelvspecifikus futásidejű kivételt ad ki.
Példák
Tegyük fel, hogy szükség van egy adatstruktúrára a számok szöveges és numerikus ábrázolásának tárolásához. Az egyes tulajdonságok értékét külön-külön szeretné megadni, és az összes tulajdonságot inicializálni is szeretné egyetlen utasításban.
Az alábbi példakód az DynamicNumber osztályból DynamicObject származtatott osztályt mutatja be.
DynamicNumber felülbírálja a TryInvoke metódust az összes tulajdonság inicializálásának egyidejű engedélyezéséhez. Felülbírálja az TrySetMember egyes objektumtulajdonságokhoz való hozzáférést engedélyező módszereket és TryGetMember metódusokat is.
// 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
Megjegyzések
Az osztályból származó osztályok felülbírálhatják ezt a DynamicObject metódust, így megadhatja, hogy az objektumot meghívó műveleteket hogyan kell végrehajtani egy dinamikus objektumon. Ha a metódus nincs felülírva, a nyelv futásidejű kötése határozza meg a viselkedést. (A legtöbb esetben futásidejű kivételt eredményez.)
Ha ez a metódus felül van bírálva, a rendszer automatikusan meghívja, ha olyan művelettel rendelkezik, mint a sampleObject(100), ahol sampleObject az DynamicObject osztályból származik.
Az objektum meghívására szolgáló művelet C# nyelven támogatott, de nem Visual Basic. A Visual Basic fordító soha nem bocsát ki kódot a metódus használatához, és a Visual Basic nyelv nem támogatja az olyan szintaxisokat, mint a sampleObject(100).