Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在运行时创建变量控件?_C#_.net_Reflection_Compact Framework_.net Assembly - Fatal编程技术网

C# 如何在运行时创建变量控件?

C# 如何在运行时创建变量控件?,c#,.net,reflection,compact-framework,.net-assembly,C#,.net,Reflection,Compact Framework,.net Assembly,我试图在运行时使用反射创建控件。 在我的例子中,我得到了一个类似字符串的标签或按钮,我想为它创建一个对象标签或按钮 Assembly WinFormasm = Assembly.Load("System.Windows.Forms,Version=2.0.000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); Control label = (Control)Activator.CreateInstance(WinFormasm.G

我试图在运行时使用反射创建控件。 在我的例子中,我得到了一个类似字符串的标签或按钮,我想为它创建一个对象标签或按钮

Assembly WinFormasm = Assembly.Load("System.Windows.Forms,Version=2.0.000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");

Control label = (Control)Activator.CreateInstance(WinFormasm.GetType("System.Windows.Forms."+type));
当我执行此操作时,会出现以下错误:

未找到文件或程序集名称“System.Windows.Forms,Version=2.0.000.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”或其依赖项之一

我真的不知道那里出了什么问题。我也尝试过:

try
{
    Type cntrl = Type.GetType("System.Windows.Forms.Button,System.Windows.Forms, Culture=neutral, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089", true);
    label1.Text += cntrl.ToString() + " ";
}
catch(Exception e)
{
    label1.Text += e.ToString() + " ";
}
尝试这个,我得到了一个执行错误:他无法创建类型并返回
null
。如果我将gettype字符串更改为
System.Int32
,它就会工作


如何使用字符串创建控件项?

以下内容有什么问题

Button cntrl = new Button();

如果要硬编码值,为什么需要使用反射?

从字符串创建控件
您需要使用
Activator
class

检查此项

您的System.Windows.Forms版本号错误:

var assembly = Assembly.Load("System.Windows.Forms, version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
然后,要创建所需的控件类型,只需指定类型名称:

var type = "Button";
var control = (Control)Activator.CreateInstance(assembly.GetType("System.Windows.Forms." + type));
我有一个非常聪明的想法,用一个小补丁来解决这个问题,它对我很有效

我从该类型中获取窗体类型(控件位于窗体右侧),我从中获取程序集。
从程序集中,我通过调用带有我想要的控件类型参数的
gettype
函数来获取对象。
最后,我将其转换为控件类型

private Control createcontrol(string type)
{
    Type typen = typeof(Form);
    Assembly assem = typen.Assembly;
    //Assembly assem = Assembly.LoadFrom(typeof(Form).ToString());
    Type controlType = assem.GetType("System.Windows.Forms."+type); // GetType(controlType);
    object obj = Activator.CreateInstance(controlType);
    Control control = (Control)obj;
    return control;
}
谢谢大家的帮助

        string ControlType = "TextBox";

        Assembly FormAssembly = Assembly.GetAssembly(typeof(Form));
        Control MyControl = (Control)FormAssembly.CreateInstance("System.Windows.Forms." + ControlType);

只是更改<代码>控件类型 Value.< /P>请考虑使用拼写检查来帮助您编写问题。许多web浏览器都将其作为内置功能提供,如Google Chrome和Mozilla Firefox。这是一个很好的方法,可以抓住那些让你的问题难以理解的简单错误。如果你只是从

Windows.Forms
加载,switch语句可能会更容易,但你也可能是从未知程序集加载?也许他正在开发类似Xaml的东西,从文件创建UI。为什么要发布毫无意义的答案?@Stecya:这不是一个“毫无意义”的答案。这并不是第一次有人试图以一种非常复杂的方式做一些事情,而这种方式可以简单得多。问题是,程序接收到一个字符串,如“按钮”或“标签”,他需要根据该字符串创建正确的控件。所以它不是硬编码的。我不知道我得到的字符串类型,可以是“按钮”、“标签”、“列表框”等。Jon得到了点他正在硬编码程序集和命名空间,因此有固定数量的控件类型可以实例化。检查[/link i]我使用的是不支持CreateInstance的紧凑框架(字符串变量)只有CreateInstance(类型)变量。唯一的问题是正确获取类型,这会一直返回null。我以前有过此错误,所以我通过使ownclass类MyButton:System.Windows.Forms.Button{}now Type t=Type.GetType(“WindowsApplication.MyButton”)来欺骗它;LoadWithPartialName已弃用,并且在de-compact.net Framework中也不受支持。感谢您指出这一点。我已将其改回使用Load。与早期版本文件或程序集名称“System.Windows.Forms,version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”或其某个依赖项中的错误相同嗯。