【问题标题】:Existing class/method for parsing fully qualified Type name用于解析完全限定类型名称的现有类/方法
【发布时间】:2012-10-17 11:49:48
【问题描述】:

鉴于我有一个类型“Wibble.Wobble”存在于程序集“Foo.Bar”中

并且该程序集未加载到主应用程序加载上下文中

是否存在将以下字符串解析为后续部分的公共机制:

"Wibble.Wobble, Foo.Bar, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xyz"

问的原因是我需要在运行时加载多种类型,其中一些可能在当前加载上下文中。其他的可能需要从外部程序集加载。

我知道如何从当前加载上下文 Type.GetType("typename") 加载类型,我知道如何加载程序集并从中获取类型 Assembly.LoadFile("xyz").GetType("abc")。我遇到的问题是,如果您尝试从程序集中加载类型它不应该是完全限定名称,而使用Type.GetType 时可以这样做。

解决方案本身不应该那么复杂,它只是在第一个逗号之前拆分字符串。但是我想知道是否有办法将完全限定名称作为对象表示,所以我不必这样做,它有助于定位正确的程序集,而不必遍历整个目录。

【问题讨论】:

    标签: c# .net reflection


    【解决方案1】:

    经过我所有的挖掘,我不相信框架中有任何公开可用的东西可以做到这一点。我希望有人能向我展示不同之处,因为我更喜欢使用经过(或应该)由比我更了解框架的人更好地测试和编写的核心功能。

    因此,我推出了自己的强类型 TypeName 对象。

    class TypeName
    {
        public TypeName(string name)
        {
            var index = name.LastIndexOf(',');
            if (index > 0)
            {
                Name = name.Substring(0, index).Trim();
    
                AssemblyName = new AssemblyName(name.Substring(index + 1).Trim());
            }
            else
            {
                Name = name;    
            }
        }
    
        public string Name { get; private set; }
    
        public AssemblyName AssemblyName { get; private set; }
    }
    

    对象接受string,它应该是类型名称或完全限定类型名称。如果它是完全限定的类型名称,则使用 AssemblyName 类设置 AssemblyName 属性,否则将其保留为 null。

    【讨论】:

    • indexof 为您提供第一次出现的逗号,它可以用作通用参数中的分隔符。那不会很漂亮
    • @DavidSchmitt 公平点,我还没有处理这种情况,但我已经更新了示例以使用 LastIndexOf 而不是 IndexOf。感谢您的提示。
    • 使用 LastIndexOf,它可能永远不会工作,考虑 System.String、mscorlib、Version=4.0.0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089 的最后一个索引只会获得 PublicKeyToken 部分
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2017-06-20
    • 2019-12-14
    • 2016-04-21
    相关资源
    最近更新 更多