Почему мой TryInvokeMember не вызывается?

Моя реализация DynamicObject выглядит так:

public class DynCallsite: DynamicObject
{
    public DynCallsite(ScriptPlayer player)
    {
        _player = player;
    }

    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
    {
        var ftt = new CallTranslator();

        var request = ftt.CreateXmlRequest(binder.Name, args);

        var callResult = _player.CallFunction(request);
        result = ftt.DeserializeXmlRequest(callResult);

        return true;            
    }

    private ScriptPlayer _player;
}

Вот как я использую экземпляр этого объекта:

class DynHost
{
    public DynHost()
    {
        _callSite = new DynCallsite(new ScriptPlayer());
    }    

    public dynamic Callsite
    {
        get { return _callsite; }   // A breakpoint put here will be hit
    }
}

// *snip*

var dh = new DynHost();
dh.Callsite.MyMethod("str1", 5, "str2");

Это раньше работало :), я не уверен, что изменилось. Отладчик не прерывает вызов TryInvokeMember, и я получаю RuntimeBinderException. Этот класс определен в сборке, отличной от текущей (ссылка на него выполняется обычным образом, путем добавления ссылок на проект из того же решения).

После вызова экземпляра я получаю следующую трассировку стека:

Похоже, что я использовал экземпляр DynamicObject вместо своего специализированного производного класса. Однако я подтвердил, что это не так, поскольку я могу проверить объект callite в отладчике, и он говорит DynCallsite. Что могло вызвать это?

Я предполагаю, что если вы используете динамический напрямую, он будет работать. Проблема может заключаться в том, что вы возвращаете его через собственность. Таким образом это работает в привязке данных WPF. Если я даю динамический напрямую как DataContext, привязка работает. Если я использую свойство, как вы, я получаю ошибки привязки.


person Tamás Szelei    schedule 08.07.2012    source источник
comment
чтобы предотвратить _1_ моменты в будущем, рассмотрите возможность использования системы контроля версий, такой как mercurial.   -  person Jon Skeet    schedule 08.07.2012
comment
Спасибо, сейчас я на хорошей стороне (счастливый пользователь git почти 2 года), но это старый проект, в котором меня не было :)   -  person Adam    schedule 08.07.2012
comment
Эй, мне интересно, следует ли вам также переопределить _1_, он возвращает истину или ложь, сообщая DLR о погоде, что член существует в экземпляре.   -  person Tamás Szelei    schedule 08.07.2012
comment
У меня есть TryGetMember и TrySetMember, но я думаю, что они предназначены для вещей типа свойств (и они реализованы соответственно). Поскольку объект скрипта принимает несуществующие свойства, они всегда возвращают истину (и получают / устанавливают динамические свойства на плеере). И точки останова в них тоже не попадают.   -  person Zasz    schedule 08.07.2012
comment
Я думаю, что единственный вариант, который у вас есть прямо сейчас, - это декомпилировать код, сгенерированный компилятором, и погрузиться в него, чтобы понять, что может происходить ... ваш код выглядит нормально для меня, и на самом деле я смог использовать ваш код в заглушка и успешно ее запускаем ...   -  person Tamás Szelei    schedule 08.07.2012
comment
Microsoft.CSharp.RuntimeBinder.RuntimeBinderController. SubmitError (Microsoft.CSharp.RuntimeBinder.Errors.CError pError) + 0x23 байта
Microsoft.CSharp.RuntimeBinder.Semantics.LangCompiler. SubmitError (Microsoft.CSharp.RuntimeBinder.Errors.CParameterizedError error) + 0x24 байта
Microsoft.CSharp.RuntimeBinder.Errors.ErrorHandling. ErrorTreeArgs (Microsoft.CSharp.RuntimeBinder.Errors.ErrorCode id, Microsoft.CSharp.RuntimeBinder.Errors.ErrArg [] prgarg) + 0x53 байта Microsoft.CSharp.RuntimeBinder.Semantics.MemberLookup. ReportErrors () + 0x6cd байт
Microsoft.CSharp.RuntimeBinder.RuntimeBinder. BindCall (полезные данные Microsoft.CSharp.RuntimeBinder.ICSharpInvokeOrInvokeMemberBinder, вызывающий объект Microsoft.CSharp.RuntimeBinder.Semantics.EXPR, Microsoft.CSharp.RuntimeBinder.RuntimeBinder.ArgumentObject [] аргументы словаря System.Cen ) + 0x206 байт Microsoft.CSharp.RuntimeBinder.RuntimeBinder. DispatchPayload (полезная нагрузка System.Dynamic.DynamicMetaObjectBinder, аргументы Microsoft.CSharp.RuntimeBinder.RuntimeBinder.ArgumentObject [], System.Collections.Generic.Dictionary по словарю) + <0xb1 br> Microsoft.CSharp.RuntimeBinder.RuntimeBinder. BindCore (полезная нагрузка System.Dynamic.DynamicMetaObjectBinder, параметры System.Collections.Generic.IEnumerable, аргументы System.Dynamic.DynamicMetaObject [], out System.Dynamic.DynamicMetaObject deferredBinding) + 0xbc байтов
Microsoft.CSharp.RuntimeBinder.RuntimeBinder. Bind (полезная нагрузка System.Dynamic.DynamicMetaObjectBinder, System.Collections.Generic.IEnumerable параметры, аргументы System.Dynamic.DynamicMetaObject [], out System.Dynamic.DynamicMetaObject deferredBinding) + 0x56 байт
Microsoft.CSharp.RuntimeBinder.BinderHelper. Bind (действие System.Dynamic.DynamicMetaObjectBinder, Microsoft.CSharp.RuntimeBind Связывание er.RuntimeBinder, System.Collections.Generic.IEnumerable args, System.Collections.Generic.IEnumerable arginfos, System.Dynamic.DynamicMetaObject onBindingError) + 0x2ca байтов Microsoft.CSharp.RuntimeBinder.CSmberpInvoke System.Dynamic.DynamicMetaObject target, System.Dynamic.DynamicMetaObject [] args, System.Dynamic.DynamicMetaObject errorSuggestion) + 0x77 байт
System.Dynamic.DynamicObject. MetaDynamic.BindInvokeMember. AnonymousMethod__10 (System.Dynamic.DynamicMetaObject e) + 0x1b байт
System.Dynamic.DynamicObject.MetaDynamic. BindInvokeMember (связыватель System.Dynamic.InvokeMemberBinder, System.Dynamic.DynamicMetaObject [] args) + 0xb8 байтов System.Dynamic.InvokeMemberBinder.Bind (System.Dynamic.DynamicMetaObject target, System.Dynamic.DynamicMetaObject [] args) + 0x36 байт System.Dynamic.DynamicMetaObject []. args, параметры System.Collections.ObjectModel.ReadOnlyCollection, System.Linq.Expressions.LabelTarget returnLabel) + 0xea байтов System.Runtime.CompilerServices.CallSiteBinder. BindCore> (System.Runtime.CompilerServices> siteServices. , object [] args) + 0x80 байт System.Dynamic.UpdateDelegates. UpdateAndExecuteVoid3 (сайт System.Runtime.CompilerServices.CallSite, объект arg0, decimal arg1, double arg2) + 0x30e байтов MyApp.DynCallsite. < strong> MyMethod (строка str1, десятичное число, строка str2) Строка 96 + 0x17d байт C #   -  person Amit Mittal    schedule 09.07.2012


Ответы (1)


Вы не показали, как используете объект. Если бы вы могли составить короткую, но полную программу, демонстрирующую проблему, это действительно помогло бы.

person kokoska69    schedule 27.07.2012