我必须允许用户轻松识别程序集中的类型,然后获取相应的Type对象。
假设我可以要求他们给我一个assembly qualified name,但它有点笨拙,并且很难弄清楚装配是否签名。但是,我会更容易,因为我可以使用Type.GetType(string)来获取我的类型对象。
如果我允许我的用户为我提供名称空间限定的类型名称(Namespace.Type),我不能使用Type.GetType来查找我的类型对象。这引出了我的问题。
据我所知,执行此操作的唯一方法是通过当前的AppDomain(假设已加载类型的程序集 - 在我的情况下将为真),并搜索所有程序集及其类型匹配名称(Type.FullName)。由于app域有超过80个程序集,其中定义了数千种类型,这可能会导致UI出现一些延迟(我在IValueConverter中执行此操作)。
为了缓解这个问题,我使用一个众所周知的程序集公钥标记列表来清除我知道将要加载的所有程序集,并且不包含我正在寻找的类型。该解决方案适度成功。
我的问题是,是否有更快,更好的方法可以用来在当前AppDomain中找到与包含其FullName的字符串匹配的Type?
这是我目前的代码:
private static string[] wellKnownTokens = new string[] {
"b03f5f7f11d50a3a",
"4fe470e63e2d354f",
"b77a5c561934e089",
"31bf3856ad364e35" };
private Type GetTypeFromFullName(string fullName)
{
var assys = from x in AppDomain.CurrentDomain.GetAssemblies()
where !wellKnownTokens.Any(y => x.FullName.EndsWith(y))
select x;
return (from x in assys.SelectMany(x => x.GetTypes())
where x.FullName == typeName
select x).FirstOrDefault();
}
答案 0 :(得分:1)
一种方法是遍历每个加载的程序集(80个程序集),并为每个程序集将程序集名称附加到类型名称(即使类型名称程序集合格化),然后使用Type.GetType(string, boolean)
[确保boolean throwOnError
是假的]
不看Type.GetType(string, boolean)
的实现,我不知道这是否会比循环遍历所有程序集中的所有类型更快。
答案 1 :(得分:0)
也许一次性缓存创建算法可以完成这项工作。映射一次,无限期使用: - )