在c#中通过反射机制method.Invoke激活方法时怎么传递泛型参数,比如List<自定义数据结构>list?

 我来答
百度网友34a94f061
2013-05-23 · TA获得超过103个赞
知道答主
回答量:43
采纳率:0%
帮助的人:72.2万
展开全部
可以这么搞:
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);
        }
    }
}

1.

2.

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式