Я пишу скрипт Python на IronPython, который использует DLL C #, реализующую шаблон наблюдатель / наблюдаемый , библиотека C # имеет наблюдаемый класс, и я хочу реализовать наблюдатель в Python.
Я регистрирую свою функцию Python как метод наблюдателя, но когда он вызывается, я получаю исключение "System.MissingMemberException: 'PeripheralDiscoveredEventArgs' object has no attribute 'ChangeType'
.
Я не могу найти никакой документации о том, как использовать пользовательские аргументы сСобытия C # при использовании IronPython, смотрел здесь , здесь , здесь и здесь .
Мой код Python:
central = None
def MyCallback(sender, event_args):
print event_args.ChangeType, event_args.Name
def main():
global central
central = objFactory.GetCentral();
d = System.EventHandler[CustomEventArgs](MyCallback)
central.myHandler += d
(do something)
if __name__ == "__main__":
main()
Я также пытался сделать следующее:
central.myHandler += MyCallback
Но я получил то же исключение.
Переменная central
в качестве центрального момента иСвойство central.myHandler
в классе Central определено как:
public event EventHandler<CustomEventArgs> myHandler = delegate { };
Класс CustomEventArgs
определен как:
public class CustomEventArgs: EventArgs
{
public CustomEventArgs(Class1 obj1, int i, Class2 obj2, bool tf);
public Class1 Obj1 { get; }
public int I{ get; }
public Class2 Obj2t { get; }
public bool Tf{ get; }
}
Наблюдаемый метод класса, который вызывает мой обратный вызов,:
internal abstract class EventHelper
{
internal static void TriggerEvent<T>(EventHandler<T> eventHandler, object source, T args)
{
// event handle no used ?
if (eventHandler == null) return;
try
{
// call event handler
eventHandler(source, args);
}
catch (Exception ex)
{
var target = eventHandler.Target != null ? eventHandler.Target : "unknown";
var methodName = (eventHandler.Method != null && eventHandler.Method.Name != null) ? eventHandler.Method.Name : "unknown";
Log.Error(string.Format("Exception in event handler '{0}' in '{1}'", methodName, target), ex);
}
}
Исключение составляет:
"System.MissingMemberException: 'CustomEventArgs' object has no attribute 'ChangeType'
at IronPython.Runtime.Binding.PythonGetMemberBinder.FastErrorGet`1.GetError(CallSite site, TSelfType target, CodeContext context)
at System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite site, T0 arg0, T1 arg1)
at __main__$1.MyCallback$74(PythonFunction $function, Object sender, Object event_args) in C:\\code\\Launcher.py:line 51
at System.Dynamic.UpdateDelegates.UpdateAndExecute3[T0,T1,T2,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2)
at _Scripting_(Object[] , Object , CustomEventArgs )
at System.EventHandler`1.Invoke(Object sender, TEventArgs e)
at EventHelper.TriggerEvent[T](EventHandler`1 eventHandler, Object source, T args) in C:\\code\\Utility\\EventHelper.cs:line 27"
Любые указатели о том, какиспользовать пользовательские аргументы событий в C # с IronPython?Спасибо !!
Среда:
- Windows 7 Enterprise 64 бит
- IronPython 2.7.8 (2.7.8.0) в .NET 4.0.30319.42000 (32-бит))
- .NET Framework 4.5.2