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或当前正在执行的程序集中找到类型时才有效.
如果这些都不是真的,那么您将需要一个程序集限定的名称.
小智 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名称).
小智 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)
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 的原因。
如果该类型在当前执行的程序集中或 Mscorlib.dll 中,则提供由其命名空间限定的类型名称就足够了。
如果它是嵌套类型,您可能忘记转换a.到+
无论如何,typeof( T).FullName
会告诉你应该说些什么
编辑:BTW使用(因为我相信你知道)只是编译时编译器的指令,因此不会对API调用的成功产生任何影响.(如果您有项目或程序集引用,可能会产生影响 - 因此信息无用,只需要进行一些过滤......)
我打开用户控件,具体取决于用户有权访问数据库中指定的用户控件.所以我使用这个方法来获取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中返回的值来创建该对象的实例.
小智 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)
归档时间: |
|
查看次数: |
163853 次 |
最近记录: |