Моя реализация 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, привязка работает. Если я использую свойство, как вы, я получаю ошибки привязки.
Microsoft.CSharp.RuntimeBinder.Semantics.LangCompiler. SubmitError strong> (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 stro ng> (строка str1, десятичное число, строка str2) Строка 96 + 0x17d байт C # - person Amit Mittal   schedule 09.07.2012