的System.Windows.Threading.DispatcherObject类(DependencyObject基于)包含有用的功能,称为CheckAccess(),确定所述代码是否被UI线程上运行.
当我昨天想要使用它时,我很困惑地发现Intellisense没有显示该函数(也没有VerifyAccess(),当不在UI线程上时抛出异常),即使MSDN库列出它.我决定使用Reflector调查这个类.似乎有问题的函数EditorBrowsable(EditorBrowsableState.Never)附加了一个属性.使用的Dispatcher类DispatcherObject具有附加到的相同属性CheckAccess()和VerifyAccess():
public abstract class DispatcherObject
{
// ...
[EditorBrowsable(EditorBrowsableState.Never)]
public bool CheckAccess();
[EditorBrowsable(EditorBrowsableState.Never)]
public void VerifyAccess();
// ...
[EditorBrowsable(EditorBrowsableState.Advanced)]
public Dispatcher Dispatcher { get; }
}
public sealed class Dispatcher
{
// ...
[EditorBrowsable(EditorBrowsableState.Never)]
public bool CheckAccess();
[EditorBrowsable(EditorBrowsableState.Never)]
public void VerifyAccess();
// ...
}
Run Code Online (Sandbox Code Playgroud)
我不相信该属性的应用是随机的(或一个笑话),所以我的问题是:它为什么存在?这些方法不应该直接调用吗?那么为什么不是它们protected(或者internal,像WPF中一些最有用的方法)?
可能重复:
如何获取当前正在执行的代码的HMODULE?
我正在尝试在自己的模块中找到资源.如果这个模块是一个可执行文件,那很简单 - GetModuleHandle(NULL)返回"main"模块的句柄.
但是,我的模块是由另一个可执行文件加载的DLL.所以GetModuleHandle(NULL)将模块句柄返回到该可执行文件,这显然不是我想要的.
有没有办法确定包含当前运行代码的模块的模块句柄?在调用中使用DLL的名称GetModuleHandle()对我来说似乎是一个黑客(如果有问题的代码被移植到不同的DLL中,则不易维护).
我目前正在重写自定义RPC机制的一部分(不能被其他东西替换,所以不建议;-)).调用的参数收集在内部使用字典的自定义集合中.有一种方法T Get<T>(string)可以检索命名参数.对于可选参数,我想添加一个TryGet<T>(string)返回参数的方法,或者null如果它不存在,那么调用代码可以使用null合并运算符提供默认值.当然,对于值类型,这不起作用,但我可以使用T?,这是我想要的.
所以我拥有的是:
public class Arguments
{
// lots of other code here
public T TryGet<T>(string argumentName) where T : class
{
// look up and return value or null if not found
}
public T? TryGet<T>(string argumentName) where T : struct
{
// look up and return value or null if not found
}
}
Run Code Online (Sandbox Code Playgroud)
有了这个,我希望能够做到以下几点:
return new SomeObject(
args.TryGet<string>("Name") ?? "NoName",
args.TryGet<int>("Index") ?? 1
);
Run Code Online (Sandbox Code Playgroud)
由于约束是互斥的,编译器应该能够生成正确的代码(始终可以从调用站点给出的泛型类型推断出调用).编译器抱怨该类型已经定义了一个名为"TryGet"的成员,该成员具有相同的参数类型.
有没有办法让这样的工作没有给这两种方法不同的名字?