【发布时间】:2010-12-28 02:54:54
【问题描述】:
我必须为用户提供一种简单的方法来识别程序集中的类型,然后获取相应的 Type 对象。
假设我可以要求他们给我一个assembly qualified name,但它有点笨拙,而且很难弄清楚程序集是否已签名。不过,这对我来说会更容易,因为我可以使用 Type.GetType(string) 来获取我的类型对象。
如果我允许我的用户为我提供一个命名空间限定的类型名称 (Namespace.Type),我将无法使用 Type.GetType 来查找我的类型对象。这引出了我的问题。
据我所知,做到这一点的唯一方法是探索当前的 AppDomain(假设类型的程序集已加载——在我的情况下为真),然后搜索所有程序集及其类型匹配的名称 (Type.FullName)。由于应用程序域加载了超过 80 个程序集并定义了数千种类型,这可能会导致 UI 出现一些延迟(我在 IValueConverter 中执行此操作)。
为了缓解这种情况,我使用一个众所周知的程序集公钥标记列表来清除所有我知道将被加载且不包含我正在寻找的类型的程序集。这个解决方案是适度成功的。
我的问题是,有没有更快、更好的方法可以用来在当前 AppDomain 中找到与包含其 FullName 的字符串匹配的类型?
这是我当前的代码:
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();
}
【问题讨论】: