在c#中通过反射机制method.Invoke激活方法时怎么传递泛型参数,比如List<自定义数据结构>list?
1个回答
展开全部
可以这么搞:
Assembly asm = Assembly.Load("UITestDesignTools1.0");//加载反射的dll
List<类型> list = new List<类型>();
Object[] parameters = new Object[2];//这里存放参数,有几个参数那么数组就定义几个
parameters[0] =list ;//给第一个参数赋值
parameters[1] = 123456 ;//给第2个参数赋值
Object instanceObj = asm.CreateInstance("Windows.Forms.frmControlStyle", true, System.Reflection.BindingFlags.Default, null, parameters, null, null); //反射获取指定类的对象
Form f = instanceObj as Form;
f.Show()
上面这样就已经在反射对象的时候传参了。这里是给构造方法传参,
如果是给类里面的方法传参,看下面的
------------------------------------------------分割线----------------------------------------------------------
如果非要用invoke的话,稍改动一下
Type testClassType = Type.GetType( "Test.TestClass", false );
if ( testClassType != null )
{
object instance = Activator.CreateInstance( testClassType, 10, 20 );
MethodInfo test1 = testClassType.GetMethod( "Test1", BindingFlags.Instance | BindingFlags.Public );
List<类型> list = new List<类型>();
Object[] parameters = new Object[2];//这里存放参数,有几个参数那么数组就定义几个
parameters[0] =list ;//给第一个参数赋值()
parameters[1] = 123456 ;//给第2个参数赋值
test1.Invoke( instance, parameters );
}
Assembly asm = Assembly.Load("UITestDesignTools1.0");//加载反射的dll
List<类型> list = new List<类型>();
Object[] parameters = new Object[2];//这里存放参数,有几个参数那么数组就定义几个
parameters[0] =list ;//给第一个参数赋值
parameters[1] = 123456 ;//给第2个参数赋值
Object instanceObj = asm.CreateInstance("Windows.Forms.frmControlStyle", true, System.Reflection.BindingFlags.Default, null, parameters, null, null); //反射获取指定类的对象
Form f = instanceObj as Form;
f.Show()
上面这样就已经在反射对象的时候传参了。这里是给构造方法传参,
如果是给类里面的方法传参,看下面的
------------------------------------------------分割线----------------------------------------------------------
如果非要用invoke的话,稍改动一下
Type testClassType = Type.GetType( "Test.TestClass", false );
if ( testClassType != null )
{
object instance = Activator.CreateInstance( testClassType, 10, 20 );
MethodInfo test1 = testClassType.GetMethod( "Test1", BindingFlags.Instance | BindingFlags.Public );
List<类型> list = new List<类型>();
Object[] parameters = new Object[2];//这里存放参数,有几个参数那么数组就定义几个
parameters[0] =list ;//给第一个参数赋值()
parameters[1] = 123456 ;//给第2个参数赋值
test1.Invoke( instance, parameters );
}
追问
刚刚我试了一下,还是不行
//dll文件简写
public struct Save {int n;}
public class Polygon
{ public Polygon(Form fm,List list){;}
}
然后在主程序中调用
p[0] = this;//p即paramters
p[1] = list;
object polygon = asm.CreateInstance("Polygon", 参数~, p,参数~);
}
运行到最后那条语句时,都报错“"未找到类型“Polygon_Component.Polygon”上的构造函数。”? 改成Activator时,又报出同样的错误
追答
问题出在了Save这里,你把Save写成一个单独的cs文件中试试
//1.Save.cs
namespace WindowsFormsApplication1
{
public struct Save
{
int n;
}
}
//2.
namespace WindowsFormsApplication1
{
public partial class Form6 : Form
{
public Form6()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Assembly ase = Assembly.GetExecutingAssembly();
Object[] parameters = new Object[2];
parameters[1] = new List<Save>();
parameters[0] = this;
//反射
object obj = ase.CreateInstance("WindowsFormsApplication1.Polygon", true, BindingFlags.Default, null, parameters, null, null);
(obj as Form).Show();
}
}
}
//3.Polygon.cs
namespace WindowsFormsApplication1
{
public partial class Polygon : Form
{
public Polygon()
{
InitializeComponent();
}
public Polygon(Form fm, List<Save> list)
: this()
{
MessageBox.Show("反射过来了 " + fm.Text);
}
}
}
2.
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询