SORU
2 Aralık 2009, ÇARŞAMBA


Nasıl ifade geçersiz bir yöntem DynamicMetaObject sonucunda çağrı yapıyorum.BindİnvokeMember?

C, ikinci baskı için IDynamicMetaObjectProvider kısa bir örnek vermeye çalışıyorum# Derinlemesine ve sorunlar karşılaştım.

Geçersiz bir çağrı ifade edebilmek istiyorum, ve başarısız oluyorum. Eğer dinamik olarak geçersiz bir yöntem yansıma bağlayıcı kullanarak arama yaparsanız, her şey olabilir, çünkü eminim. İşte kısa ama tam bir örnek:

using System;
using System.Dynamic;
using System.Linq.Expressions;

class DynamicDemo : IDynamicMetaObjectProvider
{
    public DynamicMetaObject GetMetaObject(Expression expression)
    {
        return new MetaDemo(expression, this);
    }

    public void TestMethod(string name)
    {
        Console.WriteLine(name);
    }

}

class MetaDemo : DynamicMetaObject
{
    internal MetaDemo(Expression expression, DynamicDemo demo)
        : base(expression, BindingRestrictions.Empty, demo)
    {
    }

    public override DynamicMetaObject BindInvokeMember
        (InvokeMemberBinder binder, DynamicMetaObject[] args)
    {
        Expression self = this.Expression;

        Expression target = Expression.Call
            (Expression.Convert(self, typeof(DynamicDemo)),
             typeof(DynamicDemo).GetMethod("TestMethod"),
             Expression.Constant(binder.Name));

        var restrictions = BindingRestrictions.GetTypeRestriction
            (self, typeof(DynamicDemo));

        return new DynamicMetaObject(target, restrictions);
    }
}

class Test
{
    public void Foo()
    {
    }

    static void Main()
    {
        dynamic x = new Test();
        x.Foo(); // Works fine!

        x = new DynamicDemo();
        x.Foo(); // Throws
    }
}

Bu bir istisna atar:

İşlenmeyen Özel Durum: Sistem.Invalidcastexception: sonuç türü 'System.Void' dinamik nesne tarafından üretilen bağlayıcı 'DynamicDemo' cilt için olan tip 'Microsoft.Bulunan.RuntimeBinder.CSharpİnvokeMemberBinder' sonuç türü 'System.ile uyumlu değil'Beklenen nesne arama sitesi.

Bu yöntem bir nesne döndürür ve boş dönüş için değiştirdim, gayet iyi çalışıyor. ama sonuç sıfır olmak istemiyorum, geçersiz olmak istiyorum. Bu yansıma cilt için gayet iyi çalışıyor (Ana İlk Çağrı) ama benim dinamik nesne için başarısız olur. Bu yansıma cildi gibi çalışmak istiyorum - iyi yöntemi, sonuç kullanın etmeye çalışmadığın sürece zor.

Hedef olarak kullanabileceğim bir ifade, belirli bir tür kaçırdım mı?

CEVAP
2 Aralık 2009, ÇARŞAMBA


Şuna benzer:

DLR return type

Dönüş türü ReturnType özelliği tarafından belirtilen eşleşmesi gerekir. Standart ikili tüm bu hemen hemen her şey ya da boşluk (silme işlemleri için) nesneye sabitlenir. Eğer geçersiz bir çağrı yapıyoruz biliyorsanız sarma öneririm:

Expression.Block(
    call,
    Expression.Default(typeof(object))
);

Merkezlerinden izin vermesi ne hakkında oldukça gevşek ve zorlama bir minimum tutar otomatik olarak sağlayacaktır. Olabilir ya da her dil için mantıklı olabilir convensions bir dizi sağlamak için istemedik çünkü kurtulduk.

Önlemek için istediğiniz gibi görünüyor:

dynamic x = obj.SomeMember();

Her zaman bir değer dinamik olarak kullanıcı ile etkileşim için devam etmek için bir girişim olabilir dönmüş olacak bunu yapmak için bir yol yok.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Call Me Howard

    Call Me Howa

    18 AĞUSTOS 2012
  • Māris Zaharovs

    Māris Zahar

    28 Mayıs 2008
  • RomanAtwood

    RomanAtwood

    18 Kasım 2009