MethodCallexpression مع رميات IOBSERVEN
-
28-09-2019 - |
سؤال
انا املك MethodCallExpression
كائن أحاول إعادة أ IObservable<Thing>
مثيل باستخدام Reactive Extensions
نطاق.
private IObservable<Thing> GetThing(Expression<Func<Thing>> expression)
{
Func<Thing> method = expression.Compile()
var observable = Observable.FromAsyncPattern<Thing>(method.BeginInvoke, method.EndInvoke);
IObservable<Thing> observable = observable();
return observable;
}
المشكلة هي أنه عندما يتم تنفيذ هذا ، أحصل على استثناء وقت التشغيل التالي على observable()
:
لا يمكن تحميل الملف أو التجميع "system.coreex ، الإصدار = 1.0.2617.104 ، الثقافة = محايد ، publickeytoken = 31BF3856AD364E35" أو واحدة من تبعياتها. الدخول محظور.
إذا قمت بتشغيل الطريقة دون الإطار التفاعلي ، فكل شيء على ما يرام.
Thing item = method();
أي أفكار ما الذي يسبب هذا؟ تتم إضافة جميع مراجع التجميع.
يحرر أود أن أضيف أن التعبير المعني يحتوي على طريقة تنفذ على كائن مُسخر الذي تم إنشاؤه باستخدام MOQ.
المحلول 2
حسنًا ، تمكنت من تشغيلها ، على الرغم من أنني لم أصل إلى أسفل القضية التي تم رفضها. ربما كان إعادة تشغيل حلها. بعد تجريد الكود الخاص بي مباشرة وإعادة بناءه ، بدأت في الحصول على خطأ مختلف:
The object must be a runtime Reflection object
قمت بعد ذلك بتغيير الكود إلى التفاف إلى الطريقة الاحتجاجية في Action
قبل تطبيق RX ، وهذا يعمل:
private IObservable<Thing> GetThing(Expression<Func<Thing>> expression)
{
var method = expression.Compile();
Func<Thing> = () => method();
var observable = Observable.FromAsyncPattern<Thing>(method.BeginInvoke, method.EndInvoke);
return observable();
}
بالنسبة للسجل ، تمكنت من تقليل هذا الأمر أكثر:
private IObservable<Thing> GetThing(Expression<Func<Thing>> expression)
{
var method = expression.Compile();
Func<Thing> action = () => method();
return Observable.Start(action);
}
نصائح أخرى
هل الإطار التفاعلي مثبت للمستخدم الحالي؟ هل لديك وصول القراءة/القابلة للتنفيذ إلى هذا الملف؟