Type.GetType("TheClass");
如果namespace
不存在,则返回null
,例如:
Type.GetType("SomeNamespace.TheClass"); // returns a Type object
有没有办法避免给出namespace
名称?
Type.GetType("TheClass");
如果namespace
不存在,则返回null
,例如:
Type.GetType("SomeNamespace.TheClass"); // returns a Type object
有没有办法避免给出namespace
名称?
我使用了一个帮助方法,它搜索所有已加载的Assembly并查找与指定名称匹配的Type。尽管在我的代码中只有一个Type结果被期望,但它支持多个结果。我验证了每次使用它时仅返回一个结果,并建议您也这样做。
/// <summary>
/// Gets a all Type instances matching the specified class name with just non-namespace qualified class name.
/// </summary>
/// <param name="className">Name of the class sought.</param>
/// <returns>Types that have the class name specified. They may not be in the same namespace.</returns>
public static Type[] getTypeByName(string className)
{
List<Type> returnVal = new List<Type>();
foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies())
{
Type[] assemblyTypes = a.GetTypes();
for (int j = 0; j < assemblyTypes.Length; j++)
{
if (assemblyTypes[j].Name == className)
{
returnVal.Add(assemblyTypes[j]);
}
}
}
return returnVal.ToArray();
}
不需要把事情复杂化。
AppDomain.CurrentDomain
.GetAssemblies()
.SelectMany(x => x.GetTypes())
.FirstOrDefault(t => t.Name == "MyTypeName");
使用Where
代替FirstOrDefault
来获取所有结果。
简单的缓存版本
只需执行一次...
nameTypeLookup = typeof(AnyTypeWithin_SomeNamespace).Assembly
.DefinedTypes.Where(t => t.DeclaringType == null)
.ToDictionary(k => k.Name, v => v);
用法 - 通过字典多次查找
nameTypeLookup["TheClass"];
this.GetType().Assembly...
而不需要获取其他类型,因为我的类通过短名称引用其他类与目标类在同一个程序集中。return this.GetType().Assembly.DefinedTypes.First(t => t.Name == ClassName);
- Timpublic static readonly IEnumerable<Type> cachedAssembliesTypes =
AppDomain.CurrentDomain
.GetAssemblies()
.SelectMany(x => x.GetTypes());
public static IEnumerable<Type>? GetTypesByName(this string typeName)
{
Type? resultType = null;
try
{
resultType = Type.GetType(typeName);
}
catch
{
return null;
}
return resultType != null ?
new Type[] {resultType} :
cachedAssembliesTypes.Where(t => t.Name == typeName);
}
public static Type? GetTypeByName(this string typeName)
=> GetTypesByName(typeName)?.FirstOrDefault();
这是方法期望获得的参数,所以不行。
typeName:由其命名空间限定的类型名称。
您如何区分具有相同名称但不同命名空间的两个类?
namespace one
{
public class TheClass
{
}
}
namespace two
{
public class TheClass
{
}
}
Type.GetType("TheClass") // Which?!
ArgumentException
而不是仅返回null
。如果没有Namespace
,你无法区分。 - gdoron