我有一个在其活动中UserControl发布EventAggregator消息Loaded.为了测试这个(并Loaded引发事件)我正在创建一个窗口并向其添加控件,然后等待Loaded事件被引发.
有没有办法设置测试,以便Loaded事件触发而无需创建控件并将其添加到窗口?
例如:
[Test, RequiresSTA]
public void active_thingy_message_is_published_on_loaded()
{
const string TestMsg = "Active thingy changed";
using (AutoResetEvent loadedEvent = new AutoResetEvent(false))
{
DummyEventService eventService = new DummyEventService();
DummyControl control = new DummyControl(eventService, TestMsg);
control.Loaded += delegate { loadedEvent.Set(); };
Assert.That(eventService.Message, Is.Null, "Before.");
Window window = new Window { Content = control };
window.Show();
loadedEvent.WaitOne();
window.Dispatcher.InvokeShutdown();
Assert.That(eventService.Message, Is.EqualTo(TestMsg), "After.");
}
}
private class DummyControl : UserControl
{
public …Run Code Online (Sandbox Code Playgroud) 我正在开发一个嵌入Mono的应用程序,我想将一个事件从C++层引发到C#层.这就是我所拥有的:
void* itr(NULL);
MonoEvent* monoEvent;
while(monoEvent= mono_class_get_events(klass, &itr))
{
if(0 == strcmp(eventName, mono_event_get_name(monoEvent)))
raiseMethod = mono_event_get_raise_method(monoEvent);
}
Run Code Online (Sandbox Code Playgroud)
但是,raiseMethod总是以NULL形式返回.看一下MonoEvent的结构,看起来像是添加和删除方法,但不是加注?为了让它发挥作用,我有什么特别的事要做吗?
编辑:如果重要,这里是我在C#层使用的委托,类和事件的(基本)形式.
public delegate void MyHandler(uint id);
public class SimpleComponent : NativeComponent
{
public event MyHandler OnEnter;
public event MyHandler OnExit;
}
Run Code Online (Sandbox Code Playgroud) 我想编写一个可重用的函数来通过反射来引发事件.
搜索之后,我发现了类似的问题:如何通过.NET/C#中的反射来引发事件?
它一直有效,直到我向WinForm控件注册一个事件处理程序并尝试调用它.私人领域' <EventName>'简直消失了.
下面是我的简化代码,它可以重现问题:
Program.cs中:
public static void Main()
{
Control control = new Control();
control.Click += new EventHandler(control_Click);
MethodInfo eventInvoker = ReflectionHelper.GetEventInvoker(control, "Click");
eventInvoker.Invoke(control, new object[] {null, null});
}
static void control_Click(object sender, EventArgs e)
{
Console.WriteLine("Clicked !!!!!!!!!!!");
}
Run Code Online (Sandbox Code Playgroud)
这是我的ReflectionHelper类:
public static class ReflectionHelper
{
/// <summary>
/// Gets method that will be invoked the event is raised.
/// </summary>
/// <param name="obj">Object that contains the event.</param>
/// <param name="eventName">Event Name.</param>
/// <returns></returns>
public …Run Code Online (Sandbox Code Playgroud) 我正在为我的游戏添加重播功能.有了这个功能,我可以捕获用户对游戏的输入并稍后将它们反馈给Unity以重放游戏.但是VRStandardAssets.Utils.VRInput类的设计阻止了我模仿用户输入.
此类不提供任何公共方法,以便以编程方式触发其事件(例如OnClick或OnDoubleClick事件).所以我决定从它创建一个派生类,并编写我自己的公共方法来触发事件.此策略失败,因为VRInput的方法是私有的意思,我不能从派生类调用它们.
建议这类类提供受保护的虚拟void On [eventName](subclassOfEventArgs e)方法,以便为派生类提供一种使用覆盖来处理事件的方法,但是这个类没有它(为什么这么限制? ).我猜这是Unity的糟糕设计.这种糟糕的设计也使得编写单元/集成测试变得困难.
我在这里错过了什么吗?在重放游戏时,我还能做些什么来欺骗其他类认为他们正在处理VRInput类吗?
如何提高PropertyChanged对SomeProperty类B?
此示例无法编译,因为PropertyChanged无法以这种方式访问...
public class A : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
}
public class B : A
{
private object _someProperty;
public object SomeProperty
{
get => _someProperty;
set
{
_someProperty = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SomeProperty)))
}
}
}
Run Code Online (Sandbox Code Playgroud)