Type.GetType()返回null

时间:2012-01-03 17:44:47

标签: c# asp.net web-applications user-controls gettype

我有一个使用usercontrols动态创建网页的Web应用程序。

在我的代码中,我有以下内容:

    private void Render_Modules()
    {
        foreach (OnlineSystemPageCustom.OnlineSystemPageHdr.OnlineSystemPageModule item in custompage.Header.Modules)
        {
            if (item.ModuleCustomOrder != 99 && !item.ModuleOptional)
            {
                string typeName = item.ModuleInternetFile;
                Type child = Type.GetType(typeName);
                webonlinecustombase ctl = (webonlinecustombase)Page.LoadControl("../IPAM_Controls/webtemplatecontrols/" + child.Name.ToString() + ".ascx");
                ctl.Event = Event;
                ctl.custompage = custompage;
                ctl.custommodule = item;
                this.eventprogrammodules.Controls.Add(ctl);
            }
        }
    }

正在返回的“typeName”(示例)是:

IPAMIntranet.IPAM_Controls.webtemplatecontrols.eventorgcommittee

用户控件的命名空间如下:

namespace IPAMIntranet.IPAM_Controls

我遇到的问题是Type.GetType(typeName)返回null。我在这里缺少什么?

3 个答案:

答案 0 :(得分:25)

Type.GetType(string)仅在当前正在执行的程序集中查找mscorlib,而不是在字符串中指定程序集名称。

选项:

如果你有一个简单的方法来获取相关的程序集(例如通过typeof(SomeKnownType).Assembly),那么第二个选项可能更简单。

答案 1 :(得分:4)

Type.GetType看起来像调用程序集和一些系统程序集。除此之外,您必须使用assemblyInstance.GetType(typeName),或者必须使用"程序集限定名称"类型,包括可以找到类型的程序集详细信息。否则,它将无法找到,并将返回null。你可以从:

获得
string aqn = someType.AssemblyQualifiedName;

答案 2 :(得分:0)

我遇到了与原始海报非常相似的问题,除了我需要在静态实用程序类而不是ASPX页面中实例化自定义用户控件的代码隐藏类,因此我无法使用LoadControl 。这就是我最终做的事情:

public static class Utils
{
    public static string MyFunc(string controlClassName)
    {
        string result = "";
        // get a list of all assemblies in this application domain
        Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
        // the trouble is that we don't know which assembly the class is defined in,
        // because we are using the "Web Site" model in Visual Studio that compiles
        // them on the fly into assemblies with random names
        // -> however, we do know that the assembly will be named App_Web_*
        // (http://msdn.microsoft.com/en-us/magazine/cc163496.aspx)
        foreach (Assembly assembly in assemblies)
        {
            if (assembly.FullName.StartsWith("App_Web_"))
            {
                // I have specified the ClassName attribute of the <%@ Control %>
                // directive in the relevant ASCX files, so this should work
                Type t = assembly.GetType("ASP." + controlClassName);
                if (t != null)
                {
                    // use reflection to create the instance (as a general object)
                    object o = Activator.CreateInstance(t);
                    // cast to the common base type that has the property we need
                    CommonBaseType ctrl = o as CommonBaseType;
                    if (ctrl != null)
                    {
                        foreach (string key in ctrl.PropertyWeNeed)
                        {
                            // finally, do the actual work
                            result = "something good";
                        }
                    }
                }
            }
        }
        return result;
    }
}

它不漂亮且效率不高,如果App_Web_ *命名约定发生变化,可能会破坏(尽管你可以查看所有这些内容):但它确实有用......