在WPF中是否有保存此数据的方法或映射?我想传递URI并获得Type作为回报?
我知道Application.GetResourceStream(URI)
,但这会返回BAML流。
谢谢。
答案 0 :(得分:0)
经过一番研究,我没有找到任何可以从URI返回基础类型的方法。
URI所做的全部工作都指向嵌入在某个程序集中的资源,而我通过手动提取资源来获得所需的信息:
public static Type GetTypeFromUri(Uri uri)
{
Type type = null;
using (var stream = Application.GetResourceStream(uri).Stream)
using (var reader = new Baml2006Reader(stream))
{
while (reader.Read())
{
if (reader.Type != null)
{
type = reader.Type.UnderlyingType;
break;
}
}
}
return type;
}
以下代码在一些假设下起作用:
测试表明,读取器首先解析包含的名称空间,然后解析代码背后的Type,因此会调用reader.Read()
的一些迭代(其中reader.Type为空,但reader.Namespace已填充-我们不需要的),然后是我们需要的部分。
如果我们继续阅读流,它将遍历可视化树并解析子类型。
由于Wikipedia这样说:
在运行时,框架引擎从程序集资源中提取.BAML文件,对其进行解析,然后创建相应的WPF可视树或工作流。
我相信这是正确的方法。
如果您认为这不是最有效的方法,或者应该做得更好,请给出新的答案。