问题: 我发现自己经常想要处理一组对象上的事件.在从集合中添加和删除对象时,必须挂钩或取消挂钩每个对象.我发现这对于设计每个使用相同事件挂钩代码的类来说是乏味和重复的.
期望的解决方案:所以,我正在尝试提供类似于EventBindingList包含可挂钩对象的东西,并允许用户一次挂钩多个对象,以及添加和删除列表中的对象.
为了保持通用性,有必要使用Reflection.在列表的构造函数中,用户可以通过EventInfo或Event name指定要挂接的事件.这似乎是最简单的方法.
private EventInfo _info;
public EventBindingList(string EventName)
{
_info = typeof(T).GetEvents().Where(e => e.Name == EventName).First();
}
public EventBindingList(EventInfo info)
{
_info = info;
}
Run Code Online (Sandbox Code Playgroud)
我尝试了几种方法,但我仍然遇到方法,委托,lambdas和EventHandlers之间的差异问题.
解决方案1失败:
我试过的一个不起作用的解决方案是使用自定义事件访问器.这将是包含要挂钩的对象的列表上的事件.这是因为,在添加EventHandler时,会抛出ArgumentException:Object of type 'System.EventHandler' cannot be converted to type 'ExternalProject.CustomEventHandler'.我尝试将EventHandler强制转换为正确的类型(使用泛型类型参数,因为这是一个外部项目的事件处理程序),但是转换会失败.
public event EventHandler ElementEvent
{
add
{
_handlers.Add(value);
foreach (T t in this)
{
_info.AddEventHandler(t, value);
}
}
remove
{
foreach (T t in this)
{
_info.RemoveEventHandler(t, value);
}
_handlers.Remove(value);
}
}
Run Code Online (Sandbox Code Playgroud)
解决方案2失败:
我没有找到让列表本身处理事件的好方法,然后为任何订阅者调用委托.我发现尝试使用反射来添加事件处理程序需要委托.在我的测试中,我找不到保留事件参数的方法,并将这些参数传递给订阅者 …
我有一个Parent包含Child控件的UserControl 。我希望Parent控件过小时自动滚动Child。为了获得Autoscroll,我在中将AutoScroll设置为True Parent,并确保Child足够大,可以将的大小调整Parent为小于它的大小。My Parent包含在中,Form并固定在所有四个边缘上。问题在于,我似乎无法在运行时显示滚动条。
我当然不能显示没有表单的控件,除非它在Designer中。在Visual Studio 2008 Designer中,Parent自动滚动可以完美地进行:我可以调整控件的大小,并且只要它Child的边缘部分隐藏了Parent,滚动条就会出现。但是,无论在Form设计器中还是在运行时查看控件时,无论我如何调整的大小,都不会出现滚动条Parent。
这似乎是一个错误,但感觉更像是我缺少明显的东西。作为孩子的某种东西Form似乎抑制了AutoScroll。
我正在开发一个Windows 8 Metro应用程序,我们打算将它部署到我们公司内的几个平板电脑上.它不适用于Windows应用商店.
我们需要应用程序访问公司网络共享上的某些目录,但强制用户使用a FilePicker不是我们想要的.
我们的第一次尝试是使用await StorageFolder.GetFolderFromPathAsync("J:\\");.这不起作用,并产生以下异常:
mscorlib.dll中发生了未处理的"System.UnauthorizedAccessException"类型异常
WinRT信息:无法访问指定的文件或文件夹(J:\).该项目不在应用程序可以访问的位置(包括应用程序数据文件夹,可通过功能访问的文件夹以及StorageApplicationPermissions列表中的持久项目).验证文件未标记系统或隐藏文件属性.
其他信息:访问被拒绝.(HRESULT异常:0x80070005(E_ACCESSDENIED))
所以我们尝试用"J:\"驱动器映射到的网络路径替换.这也没有用,我们得到了这个例外:
mscorlib.dll中发生了未处理的"System.UnauthorizedAccessException"类型异常
WinRT信息:无法访问指定的文件(\\ domain\path\JDrive).验证清单中是否为此类型的文件声明了文件类型关联,并且该文件未标记系统或隐藏文件属性.
其他信息:访问被拒绝.(HRESULT异常:0x80070005(E_ACCESSDENIED))
我们的应用程序具有以下功能:
我们的应用程序没有声明
对于Windows应用商店应用来说,这一切都非常合理,但是有没有针对一个简单的内部应用程序的解决方法,而不是去商店?
请考虑以下代码:
List<int> list = new List<int>();
IEnumerable<int> enumerable = list;
IEnumerator<int> enumerator = enumerable.GetEnumerator();
list.Add(1);
bool any = enumerator.MoveNext();
Run Code Online (Sandbox Code Playgroud)
在运行时,最后一行抛出:
InvalidOperationException:Collection已被修改; 枚举操作可能无法执行.
我理解在更改IEnumerators时需要抛出'Collection was modified'异常IEnumerable,但我不明白这一点:
为什么IEnumerator在第一次调用时抛出此异常MoveNext()?由于IEnumerator不表示IEnumerable直到MoveNext()第一次调用的状态,为什么它不能从第一次开始跟踪变化MoveNext()而不是从GetEnumerator()?