【问题标题】:Need a fast way to find a Type based on its FullName需要一种基于 FullName 快速查找类型的方法
【发布时间】: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();
}

【问题讨论】:

    标签: .net types


    【解决方案1】:

    也许一次性缓存创建算法可以完成这项工作。映射一次,无限期使用:-)

    【讨论】:

    • 不幸的是,这对我不起作用,因为可以随时将新的类和程序集添加到 appdomain 中。
    【解决方案2】:

    一种方法是遍历每个加载的程序集(您的 80 个程序集),并将每个程序集名称附加到类型名称(即使类型名称程序集限定),然后使用 Type.GetType(string, boolean) [make确定布尔 throwOnError 是假的]

    不看Type.GetType(string, boolean) 的实现,我不知道这最终是否会比循环遍历所有程序集中的所有类型更快。

    【讨论】:

    • 清除程序集,然后使用这种方法让我大大减少了我的算法必须完成的迭代次数。谢谢。
    猜你喜欢
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    相关资源
    最近更新 更多