用于解析完全限定类型名称的现有类/方法

Bro*_*ski 6 .net c# reflection

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

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

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

"Wibble.Wobble, Foo.Bar, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xyz"
Run Code Online (Sandbox Code Playgroud)

问的原因是我需要在运行时加载各种类型,其中一些类型可能在当前的加载上下文中.其他可能需要从外部组件加载.

我知道如何从当前的加载上下文加载类型Type.GetType("typename"),我知道如何加载程序集并从中获取类型Assembly.LoadFile("xyz").GetType("abc").什么我有一个问题是,如果你试图从一个程序集加载一个类型它不应该是一个完全合格的名称,你可以使用其中的时候Type.GetType.

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

Bro*_*ski 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; }
}
Run Code Online (Sandbox Code Playgroud)

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

  • indexof 给出逗号的第一次出现,它可以用作通用参数中的分隔符。那不太漂亮 (4认同)
  • 使用 LastIndexOf,它可能永远不会工作,考虑 System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 最后一个索引将只获得 PublicKeyToken 部分 (2认同)