如何从使用Activator.CreateInstance创建的表单返回值

时间:2017-03-17 07:36:42

标签: c# winforms

我需要从使用Activator.CreateInstance创建的表单中获取返回值,但是虽然返回值设置为公共变量,但我只在调用表单中获取错误。这是代码

    private void zButtonInsert1_Click(object sender, EventArgs e)
    {
        var type = Type.GetType("MyNamespace." + this.form_name);
        using (var form = Activator.CreateInstance(type, UIB, ID) as Form)
        {
            if (form != null)
                form.ShowDialog();
                 this.ID = form._id; //Here I got the error
        }
    }

以下是错误消息

  

'Form'不包含'_id'的定义,并且没有扩展方法'_id'可以找到接受类型'Form'的第一个参数(你是否缺少using指令或汇编引用?)

在被调用的表单中,值(lastID)被分配给公共变量

  _id = (int)kon.lastID;

3 个答案:

答案 0 :(得分:1)

你应该使用get property,field ....像这样

[['c_percentage'], 'number', 'numberPattern' => '/^[0-9]{1,2}(\.([0-9]{0,2})){0,1}$/'],

答案 1 :(得分:1)

实际上,您将实例类型转换为Form并且默认情况下没有任何名称为_id的属性,因此您会收到错误。

您可以使用反射来获取属性。

private object GetProperty(Form obj, string propName)
{
   var p = ob.GetType().GetProperty(propName);
   if(p != null)
   {
       return p.GetValue(ob);
   }
   return null;
}

然后你可以调用你的代码,如下所示 -

if (form != null)
{
   form.ShowDialog();
   object val = GetProperty(form, "_id");
   this.ID = TypeCastValHere(val);
}
不要忘记将对象的返回值输入到`this.ID'型

答案 2 :(得分:1)

最好使用键入的对象。但是在这里我想你想要使用类型名称创建对象,并且你不希望/不能将对象转换为所需的类型。

即使在这种情况下,由于你知道你的表单有一个_id字段,你可以强制它们创建Id属性,并且实际上强制它们实现一个接口,当读取值时,抛出它他的界面。

例如

public interface IFormWithId
{
    int Id {get;set;}
} 

为您的类实现接口:

public partial class SomeForm: IFormWithId
{
    public int Id {get;set;}    
    public SomeForm(int id)
    {
        InitializeComponent();
        Id = id;
    }
}

然后在阅读价值时使用这样的代码:

var id = ((IFormWithId)form).Id;

如果由于任何原因您不想使用接口,您可以考虑以下选项:

如果_id是私有字段或受保护字段

如果_id是私有字段或受保护字段,并且表单没有公开字段的属性,则找到其值的唯一解决方案是使用reflecten。例如:

var field = form.GetType().GetField("_id", /*Use GetProperty for property*/
        System.Reflection.BindingFlags.NonPublic |
        System.Reflection.BindingFlags.Instance);
var value = field.GetValue(form);

如果_Id是公共字段或属性

您可以这样使用dynamic

var id = ((dynamic)form)._id;