在所有情况下,C#,Type.GetType()都不从字符串返回类名

时间:2011-09-16 03:41:59

标签: c# class reflection activator gettype

我的代码就像这样

public static object getClassInstance(string key, params  object[] constructorArgs)
        {
            string assemblyPath = null;
            string customClassName = null;
            DataSet objDataset = getAssemblyInfo(key);
            if (objDataset != null && objDataset.Tables.Count > 0 && objDataset.Tables[0].Rows.Count > 0)
            {
                assemblyPath = objDataset.Tables[0].Rows[0]["ACA_ASSEMBLY_PATH"].ToString();
                customClassName = objDataset.Tables[0].Rows[0]["ACA_CLASS_NAME"].ToString();
            }

            Assembly assembly;
            Type type;

            if (assemblyPath != null && assemblyPath != string.Empty)
            {
                assembly = Assembly.LoadFile(assemblyPath);
                type = assembly.GetType(customClassName);
            }
            else // if no customisation
            {
                type = Type.GetType(key);
            }

            object classInstance = constructorArgs == null ? Activator.CreateInstance(type) : Activator.CreateInstance(type, constructorArgs);
            if (classInstance == null) throw new Exception("broke");
            return classInstance;

        }

在上面的代码中,我传递一个密钥作为名称空间限定。 //如果代码的自定义部分在某些日子里没有正常工作。然后它突然开始行动起来了。它在某些情况下从字符串返回类名,在某些情况下它不会返回(返回null)。从密钥生成的所有类名都可以从此方法访问。这样没有可访问性问题。

我看到了文档http://msdn.microsoft.com/en-us/library/w3f99sx1.aspx。 在备注部分,它告诉

GetType仅适用于从磁盘加载的程序集。如果调用GetType来查找使用System.Reflection.Emit服务定义的动态程序集中定义的类型,则可能会出现不一致的行为。行为取决于动态程序集是否持久,即使用System.Reflection.Emit.AssemblyBuilderAccess枚举的RunAndSave或Save访问模式创建。如果动态程序集是持久的并且在调用GetType之前已写入磁盘,则加载程序会在磁盘上查找已保存的程序集,加载该程序集,并从该程序集中检索该类型。如果在调用GetType时尚未将程序集保存到磁盘,则该方法返回Nothing。 GetType不了解瞬态动态组件;因此,调用GetType以检索瞬态动态程序集中的类型将返回Nothing。

这有什么问题导致了我的问题吗? 。任何人都可以提供帮助。

0 个答案:

没有答案