这段代码:
Type.GetType("namespace.a.b.ClassName")
返回null。
我在使用:
using namespace.a.b;
类型是存在的,它在不同的类库中,我需要通过它的名字string来获取它。
这段代码:
Type.GetType("namespace.a.b.ClassName")
返回null。
我在使用:
using namespace.a.b;
类型是存在的,它在不同的类库中,我需要通过它的名字string来获取它。
当前回答
你也可以得到不带程序集限定名但带有dll名的类型,例如:
Type myClassType = Type.GetType("TypeName,DllName");
我也遇到过同样的情况,这招对我很管用。我需要一个DataModel类型的对象。QueueObject”,并有一个引用“DataModel”,所以我得到的类型如下:
Type type = Type.GetType("DataModel.QueueObject,DataModel");
逗号后的第二个字符串是引用名称(dll名称)。
其他回答
当我只有类名时,我使用这个:
Type obj = AppDomain.CurrentDomain.GetAssemblies().SelectMany(t => t.GetTypes()).Where(t => String.Equals(t.Name, _viewModelName, StringComparison.Ordinal)).First();
确保逗号直接位于完全限定名之后
typeof(namespace.a.b.ClassName, AssemblyName)
因为这不会起作用
typeof(namespace.a.b.ClassName ,AssemblyName)
在这件事上我被难住了好几天
作为Type. gettype (String)需要的类型。你应该使用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);
Version, Culture和PublicKeyToken对于assemblyName来说是不需要的,这就是为什么你可以使用MyAssembly.GetName(). name。
gettype (String):
如果类型是当前正在执行的 在Mscorlib.dll中,提供类型名就足够了 由其名称空间限定。
尝试使用包含程序集信息的完整类型名称,例如:
string typeName = @"MyCompany.MyApp.MyDomain.MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
Type myClassType = Type.GetType(typeName);
当我只使用名称空间时,也遇到了同样的情况。Classname来获取不同程序集中的类类型,这将不起作用。只有在如上所示的类型字符串中包含程序集信息时才有效。
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;
}