我需要从使用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;
答案 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;