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

7

假设我有一个类型为“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时可以这样做。
解决方案本身不应该太复杂,只需在第一个逗号之前拆分字符串即可。然而,我想知道是否有一种方法可以将完全限定名称作为对象表示获取,这样我就不必这样做,并且可以帮助定位正确的程序集,而无需遍历整个目录。
1个回答

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; }
}

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

3
indexof 给出了逗号的第一次出现,这可能被用作通用参数的分隔符。这并不是很好看。 - David Schmitt
@DavidSchmitt,说得好,我还没有遇到过那种情况,但我已经更新了示例,使用LastIndexOf而不是IndexOf。谢谢你的提示。 - Bronumski
2
使用LastIndexOf可能无法正常工作,请考虑使用System.String,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089。last index of只会获取PublicKeyToken部分。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接