首页 > 技术文章 > 参数测试

anbylau2130 2013-11-02 17:59 原文

/*------------------------------------------------------------------------------
 *  
 *  版权所有。
 *  
 *  文件名:     ParamtersAnalysis.cs
 *  功能說明:   用于创建MemberInfo成员的方法参数列表
 *
 *  創建人:    it_Eric 
 *  創建時間:   10/30/2013 10:15:20 AM
 *   
 *  修改人:    
 *  修改說明:    
 * 
*-----------------------------------------------------------------------------*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;

namespace NetAutoTest
{
    /// <summary>
    /// 用于创建MemberInfo成员的方法参数列表
  /// </summary>
    public class ParamtersAnalysis:IParamter
    {
        public MemberInfo Member { get; set; }


        private int[] _arrlenght;  //记录每维数组的长度的一维数组
        private int[] _arrpos;     //记录要读取数据的位置
        private int _groupcount;   //记录总数据长度
        private List<List<object>> _paramgrouplst;  //记录参数组合
        public ParamtersAnalysis(MemberInfo member)
        {
            Member = member;

            Type[] types = AnalysisiParamterType();
           
            _paramgrouplst = AllParameterList(types);

            _arrlenght = ArrayLenght(_paramgrouplst);

            _arrpos = new int[_paramgrouplst.Count]; 

            _groupcount = GroupCount(_paramgrouplst);
        }

    

        /// <summary>
        /// 迭代返回方法参数数组
        /// </summary>
        /// <returns></returns>
        public IEnumerable<object[]> ReturnParamters()
        {
            for (int j = 0; j < _groupcount; j++)
            {
                List<object> result = new List<object>();
                for (int i = 0; i < _paramgrouplst.Count; i++)
                {
                    if (_arrpos[i] < _paramgrouplst[i].Count)
                    {
                        result.Add(_paramgrouplst[i][_arrpos[i]]);
                    }
                }
                _arrpos = ChangeArrFlag(_arrpos, _arrlenght, _arrpos.Length);

                yield return result.ToArray();
            }
        }
        #region 私有方法
        /// <summary>
        /// 获取参数类型
        /// </summary>
        /// <returns></returns>
        private Type[] AnalysisiParamterType()
        {
            List<Type> lst = new List<Type>();
            if (Member.MemberType==MemberTypes.Method)
            {
                ParameterInfo[] paramters = ((MethodInfo)Member).GetParameters();
                foreach (var parameterInfo in paramters)
                {
                    lst.Add(parameterInfo.ParameterType);
                }
            }
            else  if(Member.MemberType==MemberTypes.Property)
            {
               lst.Add( ((PropertyInfo)Member).PropertyType);
            }
            else if(Member.MemberType==MemberTypes.Constructor)
            {
                ParameterInfo[] paramters= ((ConstructorInfo) Member).GetParameters();
                foreach (var parameterInfo in paramters)
                {
                    lst.Add(parameterInfo.ParameterType);
                }
            }

            return lst.ToArray();
            
        }

/*
        /// <summary>
        /// 判断两个数组是否是相同的数组
        /// </summary>
        /// <param name="arrpos"></param>
        /// <param name="arrlenght"></param>
        /// <returns></returns>
        private  bool IsSameArr(int[] arrpos,int[] arrlenght)
        {
            for (int i = 0; i < arrpos.Length; i++)
            {
                if (arrpos[i]!=arrlenght[i])
                {
                    return false;
                }
            }
            return true;
        }
*/

        /// <summary>
        /// 用数组保存每一个元素的长度
        /// </summary>
        /// <param name="paramgrouplst"></param>
        /// <returns></returns>
        private int[] ArrayLenght(List<List<object>> paramgrouplst)
        {
            int[] arrlenght = new int[paramgrouplst.Count];
            for (int i = 0; i < paramgrouplst.Count; i++)
            {
                arrlenght[i] = paramgrouplst[i].Count-1;
            }
            return arrlenght;
        }

        /// <summary>
        /// 控制遍历的顺序
        /// </summary>
        /// <param name="arrpos"></param>
        /// <param name="arrlength"></param>
        /// <returns></returns>
        private int[] ChangeArrFlag(int[] arrpos, int[] arrlength, int indexflag)
        {
            int[] arrposvalue = arrpos;
            
            int index = indexflag - 1;
            if (index<0)
            {
                return arrlength;
            }
            if (arrpos[index] < arrlength[index])
            {
                arrposvalue[index]++;
            }
            else
            {
                arrposvalue[index] = 0;
                arrposvalue = ChangeArrFlag(arrposvalue, arrlength, index);
            }
            return arrposvalue;
        }

      
       /// <summary>
       /// 计算组合数量
       /// </summary>
       /// <param name="paramgrouplst"></param>
       /// <returns></returns>
       private  int GroupCount(List<List<object>> paramgrouplst)
       {
           int group = 1;

           for (int i = 0; i < paramgrouplst.Count; i++)
           {
               group = group*paramgrouplst[i].Count; //计算组合数量
           }
           return group;
       }

       /// <summary>
       /// 获取参数组合的二维数组
       /// </summary>
       /// <param name="types"></param>
       /// <returns></returns>
       private List<List<object>> AllParameterList(Type[] types)
       {
           List<List<object>> paramgrouplst=new List<List<object>>();
           foreach (Type type in types)
           {
               List<object> lst = (List<object>) Type2Value(type);
               paramgrouplst.Add(lst);
           }
           return paramgrouplst;
       }

       /// <summary>
        /// 传入对应的类型返回默认值
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        private object Type2Value(Type type)
        {
           
            if (type == typeof(int) || type == typeof(uint))
            {
                   return  list2object<int>(Int2Value());
            }
            else if (type == typeof(short) || type == typeof(ushort))
            {
                return list2object<short>(Short2Value());
            }
            else if (type == typeof(long) || type == typeof(ulong))
            {
                return list2object<long>(Long2Value());
                
            }
            else if (type == typeof(double))
            {
                return list2object<double>(Double2Value());
            }
            else if (type == typeof(float))
            {
                return list2object<float>(Float2Value());
            }
            else if (type == typeof(string))
            {
                return list2object<string>(String2Value());
            }
            else if (type == typeof(bool))
            {
                return list2object<bool>(Bool2Value());
            }
            else if (type == typeof(char))
            {
                return list2object<char>(Char2Value());
            }
            else if (type == typeof(byte))
            {
                return list2object<byte>(Byte2Value());
            }
            else if (type == typeof(DateTime))
            {
                return list2object<DateTime>(Datetimes2Value());
            }
            else
            {
                return null;
            }
        }

      

       private static List<object> list2object<T>(List<T> lst )
       {
           List<object> result=new List<object>();
           foreach (T item in lst)
           {
               result.Add(item);
           }
           return result;
       }


       private static List<DateTime> Datetimes2Value()
        {
            List<DateTime> lst = new List<DateTime>();
            lst.Add(DateTime.Now);
            lst.Add(DateTime.Today);
            lst.Add(DateTime.MaxValue);
            lst.Add(DateTime.MinValue);
            return lst;
        }

        private static List<byte> Byte2Value()
        {
            List<byte> lst = new List<byte>();
            lst.Add(byte.MaxValue);
            lst.Add(byte.MinValue);
            lst.Add(default(byte));
            return lst;
        }

        private static List<char> Char2Value()
        {
            List<char> lst = new List<char>();
            lst.Add((char)new Random().Next(33, 126));
            return lst;
        }

        private static List<bool> Bool2Value()
        {
            List<bool> lst = new List<bool>();
            lst.Add(true);
            lst.Add(false);
            return lst;
        }

        private static List<string> String2Value()
        {
            List<string> lst = new List<string>();
            lst.Add(string.Empty);
            lst.Add(null);
            lst.Add("abcdefghijklmnopqrstuvwxyz");
            lst.Add("abcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabc" +
                    "defghijklmnopqrstuvwxyzzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
            return lst;
        }

        private static List<float> Float2Value()
        {
            List<float> lst = new List<float>();
            lst.Add(float.MaxValue);
            lst.Add(float.MinValue);
            lst.Add(0);
            lst.Add((float)new Random().Next(int.MinValue, int.MaxValue));
            return lst;
        }

        private static List<double> Double2Value()
        {
            List<double> lst = new List<double>();
            lst.Add(double.MaxValue);
            lst.Add(double.MinValue);
            lst.Add(0);
            lst.Add((double)new Random().Next(int.MinValue, int.MaxValue));
            return lst;
        }

        private static List<long> Long2Value()
        {
            List<long> lst = new List<long>();
            lst.Add(long.MaxValue);
            lst.Add(long.MinValue);
            lst.Add(0);
            lst.Add((long)new Random().Next(int.MinValue, int.MaxValue));
            return lst;
        }

        private static List<short> Short2Value()
        {
            List<short> lst = new List<short>();
            lst.Add(short.MaxValue);
            lst.Add(short.MinValue);
            lst.Add(0);
            lst.Add((short)new Random().Next(short.MinValue, short.MaxValue));
            return lst;
        }

        private static List<int> Int2Value()
        {
            List<int> lst = new List<int>();
            lst.Add(int.MaxValue);
            lst.Add(int.MinValue);
            lst.Add(0);
            lst.Add(new Random().Next(int.MinValue, int.MaxValue));
            return lst;
        }
        #endregion
    }

}


一个排列组合的案例,将一维数组中每一维上的数据进行组合,得到所有的组合,放入paramgrouplst中

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using NetAutoTest;
using System.Reflection;

namespace ReflectTestDemo
{
    internal static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        private static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            List<Type> typelst=new List<Type>();
            typelst.Add(typeof(string));
            typelst.Add(typeof(bool));
            typelst.Add(typeof(int));
            MemberInfo member = typeof(Person).GetConstructor(typelst.ToArray());
            // MemberInfo member = typeof (Person).GetMethod("Test");
            ParamtersAnalysis pa = new ParamtersAnalysis(member);
            IEnumerable<object[]> paramters = pa.ReturnParamters();
            List<object[]> paramterlst = new List<object[]>();
            foreach (object[] paramter in paramters)
            {
                paramterlst.Add(paramter);
            }

        }

      

        public static string TestProperty { get; set; }

        public  static void Test(string name,bool flag)
        {
            return;
        }
    }

    public class Person
    {
        public Person(string name,bool bol,int a)
        {

        }
        public Person(int  age)
        {

        }

        public string Name { get; set; }
        public int Sex { get; set; }

        public static void Test(string name,bool flag,int a)
        {
            return;
        }
    }
}

 

推荐阅读