我有一个使用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。我在这里缺少什么?
答案 0 :(得分:25)
Type.GetType(string)
仅在当前正在执行的程序集中查找mscorlib
,而不是在字符串中指定程序集名称。
选项:
Assembly.GetType(name)
如果你有一个简单的方法来获取相关的程序集(例如通过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_ *命名约定发生变化,可能会破坏(尽管你可以查看所有这些内容):但它确实有用......