请教高手,在利用反射时,如何来识别某个参数是个 params 变量的问题。 
例如: 
public class cls2{ 
    public void fnc1(object objArg, params string[] strParams){} 
    
    public void fnc2(object objArg, string[] strNomaul){} 
} MothodeFnc1.Invoke(cls2, new object[]{ arg1, new string[]{...}}); MothodeFnc2.Invoke(cls2, new object[]{ arg1, new string[]{...}}); 在这里我想请教的是在调用Invoke之前如何识别fnc1的第2个参数strParams是params的?

解决方案 »

  1.   

    object obj; 
    Type type = obj.GetType();
    PropertyInfo[] pi = typ.GetProperties();
    foreach (PropertyInfo p in pi)
     {
       Type t= p.PropertyType;
     }
    new object[] { }
      

  2.   

    我这里fnc1和fnc2都是方法,获取类的属性好像没有用阿。
    顺便说一下,MethodeInfo和ParameterInfo都找了一下,
    就是没有判断被反射的参数是否是可以省略的办法。
      

  3.   

    object obj;
                Type type = obj.GetType();
                foreach (System.Reflection.MethodInfo methodInfo in type.GetMethods())
                {
                    foreach (System.Reflection.ParameterInfo paramInfo in methodInfo.GetParameters())
                    {
                    }
                
      

  4.   

    他,本身是一个数组。
    所以实际并不存在什么 params
      

  5.   

    这个我知道。问题是得到的 paramInfo 里面找不到可以用来判断 是否是 params 的办法。
      

  6.   

    请问你知道和不知道 一个参数是不是 params 有什么区别吗?
    同样都是传入一个数组的。
      

  7.   


    那么,有以下一个情况:
    调用方:testInvoke(“a",“b",“c",“d");private void testInvoke(params object[] objParms){
        这里,我要反射 cls2.fnc1
        这时候在初始化 Invoke的第二个参数 object[] 时候
        有没有什么好办法吗?
      

  8.   

    你这么一说的确是这样。
    不过这很明显是编码的问题。
    public void fnc1(object objArg, params string[] strParams)
            { }public void fnc1(object objArg, string[] strNomaul) { }这样的代码是编译不过的。但是,如果你要找出这样的含有params的string数组,和一个object参数,的确是有难度。抱歉,帮不上忙。
      

  9.   


    直接吧objParms传给cls2.fnc1的第二个参数不可以吗?
      

  10.   

    谢谢你。
    public void fnc1(object objArg, params string[] strParams) { } public void fnc1(object objArg, string[] strNomaul) { }这个只是一个比方,别介意。
      

  11.   


    问#10楼:怎么个直接法?难道说是这样:Invoke(?,objParms)
    那么第一个参数放什么?
      

  12.   

    回Modest:就是你说的这个意图,别的方法我也在伤脑筋那。
    C#的管理机制里面我想应该有的,只是找了2,3天还是没有结果。
      

  13.   

    public void testInvoke(params string[] objParms) 

        string[] obj = new string[objParms.Count - 1]; 
        for (int i = 1; i <= obj.Count; i++) { 
            obj(i - 1) = objParms(i); 
        } 
        cls2 cls = new cls2(); 
        cls.fnc1(objParms(0), obj); 

    代码是vb转的,我不了解C#...
      

  14.   

    回 Modest:你的例子是可以实现,但是其通用性不敢苟同。另外,我觉得有点跑题了。
    我想知道的是:在执行反射某个方法之前,该方法的参数里面,是否存在 params 的参数。
    也就是说:在执行 fnc1_Mothode.Invoke 的之前,我想预知它的第二个参数 strParams
             是一个可以省略的参数。
      

  15.   

    因为我想要做一个比较通用的反射方法,那时候fnc1的参数可能情况更为复杂。你说的判断参数名称倒是个好办法,可是我要改大量别人写的代码,工作量实在是太大了。我现在想到一个办法就是利用params必须是方法参数最后一个的特点,看看是否能够适应。