Aracılığıyla paylaş


DynamicObject.TryInvoke(InvokeBinder, Object[], Object) Yöntem

Tanım

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.

Şunlara uygulanır