Type.GetType("namespace.abClassName")返回null

Omu*_*Omu 198 c# reflection

这段代码:

Type.GetType("namespace.a.b.ClassName")
Run Code Online (Sandbox Code Playgroud)

回报null.

我在使用中:

using namespace.a.b;
Run Code Online (Sandbox Code Playgroud)

更新:

类型存在,它在不同的类库中,我需要通过字符串名称来获取它.

DrP*_*zza 220

Type.GetType("namespace.qualified.TypeName") 仅在mscorlib.dll或当前正在执行的程序集中找到类型时才有效.

如果这些都不是真的,那么您将需要一个程序集限定的名称.

  • 您可以按名称加载程序集,而不是使用程序集限定名称 - 程序集a = Assembly.Load("SomeLibrary");` - 然后从程序集中按名称加载类型 - `Type t = a.GetType( "namespace.abClassName");`. (19认同)
  • 也许你可以喜欢`typeof(SomeTypeInThatAssembly).Assembly.GetTypes().Where((t)=> t.FullName == youFullName);`可能会省去一些麻烦,最终 (5认同)
  • 类型存在,它在不同的类库中,我需要按字符串名称获取 (3认同)

小智 170

您也可以获取没有程序集限定名称的类型,但也可以使用dll名称,例如:

Type myClassType = Type.GetType("TypeName,DllName");
Run Code Online (Sandbox Code Playgroud)

我有同样的情况,它对我有用.我需要一个"DataModel.QueueObject"类型的对象,并引用了"DataModel",所以我得到的类型如下:

Type type = Type.GetType("DataModel.QueueObject,DataModel");
Run Code Online (Sandbox Code Playgroud)

逗号后面的第二个字符串是引用名称(dll名称).

  • 此答案中使用的表单也是一个完全限定的类型名称[根据MSDN语法](https://msdn.microsoft.com/en-us/library/yfsftwz6(v = vs.110).aspx)(所以它不是_trick_).表单是`NamespaceTypeName,AssemblyNameSpec`,其中`AssemblyNameSpec`是没有任何属性的程序集的标识符.虽然这个答案与接受的答案基本相同但我认为有些人更喜欢这个,因为它消除了汇编属性引入的一些"噪音"(例如`Version`,`Culture``PublicKeyToken`).幸运的是,属性是__optional__. (4认同)
  • 这是"技巧"还是实际方法?我在文档-_-中找不到这个.顺便说一句,它结束了我的1周受苦!谢谢 (2认同)

小智 76

尝试使用这种方法

 public static Type GetType(string typeName)
        {
            var type = Type.GetType(typeName);
            if (type != null) return type;
            foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
            {
                type = a.GetType(typeName);
                if (type != null)
                    return type;
            }
            return null ;
        }
Run Code Online (Sandbox Code Playgroud)


eri*_*len 25

Dictionary<string, Type> typeCache;
...
public static bool TryFindType(string typeName, out Type t) {
    lock (typeCache) {
        if (!typeCache.TryGetValue(typeName, out t)) {
            foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies()) {
                t = a.GetType(typeName);
                if (t != null)
                    break;
            }
            typeCache[typeName] = t; // perhaps null
        }
    }
    return t != null;
}
Run Code Online (Sandbox Code Playgroud)


Lar*_*Bud 25

如果程序集是ASP.NET应用程序构建的一部分,则可以使用BuildManager类:

using System.Web.Compilation
...
BuildManager.GetType(typeName, false);
Run Code Online (Sandbox Code Playgroud)


小智 12

如果您的类不在当前的assambly中,则必须提供qualifiedName,此代码显示如何获取class的qualifiedname

string qualifiedName = typeof(YourClass).AssemblyQualifiedName;
Run Code Online (Sandbox Code Playgroud)

然后你可以使用qualifiedName获取类型

Type elementType = Type.GetType(qualifiedName);
Run Code Online (Sandbox Code Playgroud)

  • 我是否遗漏了一些东西,如果你执行“typeof(YourClass)”,你不是已经有了“elementType”吗? (3认同)

Flo*_*our 12

由于Type.GetType(String)需要Type.AssemblyQualifiedName你应该使用Assembly.CreateQualifiedName(String,?String)

string typeName = "MyNamespace.MyClass"; // Type.FullName
string assemblyName = "MyAssemblyName"; // MyAssembly.FullName or MyAssembly.GetName().Name
string assemblyQualifiedName = Assembly.CreateQualifiedName(assemblyName ,?typeName);
Type myClassType = Type.GetType(assemblyQualifiedName);
Run Code Online (Sandbox Code Playgroud)

Version、Culture 和 PublicKeyToken 不是必需的,assemblyName这就是您可以使用 MyAssembly.GetName().Name 的原因。

关于Type.GetType(String)

如果该类型在当前执行的程序集中或 Mscorlib.dll 中,则提供由其命名空间限定的类型名称就足够了。


Rub*_*ink 8

如果它是嵌套类型,您可能忘记转换a.到+

无论如何,typeof( T).FullName会告诉你应该说些什么

编辑:BTW使用(因为我相信你知道)只是编译时编译器的指令,因此不会对API调用的成功产生任何影响.(如果您有项目或程序集引用,可能会产生影响 - 因此信息无用,只需要进行一些过滤......)


Ste*_*han 6

我打开用户控件,具体取决于用户有权访问数据库中指定的用户控件.所以我使用这个方法来获取TypeName ...

Dim strType As String = GetType(Namespace.ClassName).AssemblyQualifiedName.ToString
Dim obj As UserControl = Activator.CreateInstance(Type.GetType(strType))
Run Code Online (Sandbox Code Playgroud)

所以现在可以使用strType中返回的值来创建该对象的实例.

  • @HimBromBeere感谢您的投票.像你这样的人会让我失去动力来发表我的发现.我仍在学习发展,我只是想帮助别人.现在你希望我回答你的问题?顺便说一句,我已正确回答了这个问题.我创建实例的类驻留在另一个项目中,因此必须使用AssemblyQualified名称.所以请在downvoting之前阅读其余的评论."类型存在,它在不同的类库中,我需要通过字符串名称 - Omu" (2认同)

小智 6

当我只有班级名称时,请使用以下名称:

Type obj = AppDomain.CurrentDomain.GetAssemblies().SelectMany(t => t.GetTypes()).Where(t => String.Equals(t.Name, _viewModelName, StringComparison.Ordinal)).First();
Run Code Online (Sandbox Code Playgroud)