DynamicObject.TryInvoke(InvokeBinder, Object[], Object) Yöntem
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
Bir nesneyi çağıran işlemler için uygulamayı sağlar. sınıfından DynamicObject türetilen sınıflar, bir nesneyi veya temsilciyi çağırma gibi işlemler için dinamik davranış belirtmek üzere bu yöntemi geçersiz kılabilir.
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
Parametreler
- binder
- InvokeBinder
Çağırma işlemi hakkında bilgi sağlar.
- args
- Object[]
Çağırma işlemi sırasında nesneye geçirilen bağımsız değişkenler. Örneğin, sınıfından sampleObject(100)
args[0]
türetilen DynamicObject işlem sampleObject
için 100'e eşittir.
- result
- Object
Nesne çağırmanın sonucu.
Döndürülenler
true
işlem başarılı olursa; aksi takdirde , false
. Bu yöntem döndürürse false
, davranışı dilin çalışma zamanı bağlayıcısı belirler. (Çoğu durumda, dile özgü bir çalışma zamanı özel durumu oluşturulur.
Örnekler
Sayıların metinsel ve sayısal gösterimlerini depolamak için bir veri yapısına ihtiyacınız olduğunu varsayalım. Her özelliğin değerini tek tek belirtebilmek ve aynı zamanda tüm özellikleri tek bir deyimde başlatabilmek istiyorsunuz.
Aşağıdaki kod örneği, sınıfından DynamicNumber
türetilen sınıfını DynamicObject gösterir. DynamicNumber
tüm özelliklerin TryInvoke bir kerede başlatılmasını etkinleştirmek için yöntemini geçersiz kılar. Ayrıca tek tek nesne özelliklerine TrySetMember erişimi etkinleştirmek için ve TryGetMember yöntemlerini geçersiz kılar.
// 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
Açıklamalar
sınıfından DynamicObject türetilen sınıflar, bir nesneyi çağıran işlemlerin dinamik nesne için nasıl gerçekleştirileceğini belirtmek için bu yöntemi geçersiz kılabilir. Yöntemi geçersiz kılınmadığında, davranışı dilin çalışma zamanı bağlayıcısı belirler. (Çoğu durumda, bir çalışma zamanı özel durumu oluşturulur.)
Bu yöntem geçersiz kılınırsa, sınıfından türetilen gibi sampleObject(100)
sampleObject
bir işleminiz olduğunda otomatik olarak çağrılırDynamicObject.
Bir nesneyi çağırma işlemi C# dilinde desteklenir ancak Visual Basic'te desteklenmez. Visual Basic derleyicisi bu yöntemi kullanmak için hiçbir zaman kod yaymaz ve Visual Basic dili gibi sampleObject(100)
söz dizimini desteklemez.