获取枚举类型并创建该类型的列表,获取类类型并使用反射创建具有该类型的列表

时间:2015-01-01 08:18:36

标签: c# .net reflection

我正在尝试创建一个通过反射调用库中所有函数的工具,为此我需要获取方法信息和参数信息。我能够得到这些参数信息(默认值,如果它是int = 0,string = empty,float = 0,enum =获取类型值和0索引值,如果参数是某种类型(isClass)然后空)。

在这种情况下我有一个问题,现在有一些函数使用参数List<int> List<enum>, list<type>,而为这些参数创建默认值对我来说有点挑战,任何人都可以帮助我。

1)列表或任何数字列表默认值应为List<int> defaultValueList = new List<int>(){0}; 2)对于list<Enum> enumDefault = new List<Enum>(){ Enum.Getvalues(0)} 3)对于List class_Default = get type,create instance,在初始化后将它添加到一个列表中(它不应该是null,这是我在这个程序中唯一的目标。

任何帮助将不胜感激

部分代码示例(请注意,上面定义的NAMES与以下示例无关)

private object[] GetParameterInfoDefault(ParameterInfo[] pInfo)
        {
            int count = pInfo.Count();
            object[] objDefaultValues = new object[count] ;
            try
            {
                int i = 0;
                foreach (ParameterInfo info in pInfo)
                {
                    objDefaultValues[i] = GetDefaultValurForTypes(info);
                    i++;
                }
            }
            catch (Exception ex)
            {
            }


            return objDefaultValues;
        }

修改

我试图在这个函数中为每个参数创建默认值但是对于List我不知道必须做什么,即函数的第一部分

private object GetDefaultValurForTypes(ParameterInfo info)
        {
            object objectDefaultValue = new object();
        try
        {

            if (info.ParameterType.UnderlyingSystemType.Name.Equals("List`1"))
            {
                List<object> objList ; 
                Type[] tempTypes = info.ParameterType.GetGenericArguments();

                foreach (Type tempT in tempTypes)
                {

                    if (tempT.UnderlyingSystemType == typeof(int))
                    {
                         objectDefaultValue = (tempT.UnderlyingSystemType.GetType()) ;

                        objectDefaultValue = 1;


                    }
                    else if (tempT.UnderlyingSystemType.IsEnum)
                    {
                        Array arr = tempT.UnderlyingSystemType.GetEnumValues();
                        objectDefaultValue = arr.GetValue(0);


                    }
                    else if (tempT.UnderlyingSystemType.IsClass)
                    {
                        objectDefaultValue =  Activator.CreateInstance(tempT);

                        //FieldInfo [] fldInfo = tempT.UnderlyingSystemType.GetFields();
                        //object [] fldInfoDefaultValues = new object[fldInfo.Count()];
                        //int i = 0;
                        //foreach (FieldInfo fldinf in fldInfo)
                        //{
                        //    fldInfoDefaultValues[i] = fldInfo.get
                        //}
                    }




                }

            }
            else if (info.ParameterType.BaseType == typeof(Enum))
            {
                //object underlyingValue = Convert.ChangeType(Enum.GetUnderlyingType(value.GetType()));

                Array arrayValue = info.ParameterType.GetEnumValues();
                objectDefaultValue = arrayValue.GetValue(0);

                //var value = propertyInfo.GetValue(obj); // this return TestOne or TestTwo

                //var enumValue = Convert.ChangeType(value, typeof(int)); // this return 3 or 4

            }
            //else if( info.ParameterType.BaseType == System
            //{

            //}
            //else   if (info.ParameterType.BaseType == typeof(int) || info.ParameterType.BaseType == typeof(float) || info.ParameterType.BaseType == typeof(double))
            //    objectDefaultValue = 0;
            else if (info.ParameterType == typeof(bool))
                objectDefaultValue = false;
            else if (info.ParameterType == typeof(int))
                objectDefaultValue = 1;
            else if (info.ParameterType == typeof(string))
                objectDefaultValue = string.Empty;
            //else if(info.ParameterType. == typeof(
            else
                objectDefaultValue = 0;
        }
        catch (Exception ex)
        {
        }


        return objectDefaultValue;

    }

1 个答案:

答案 0 :(得分:2)

我认为你的意思是:

if(info.ParameterType.IsGenericType &&
     info.ParameterType.GetGenericTypeDefinition() == typeof(List<>))
{
    // create list
    IList objList = (IList)Activator.CreateInstance(info.ParameterType);

    // resolve T in List<T>
    Type type = info.ParameterType.GetGenericArguments()[0];

    // avoid problems with List<Nullable<Something>>
    type = Nullable.GetUnderlyingType(type) ?? type;

    // now apply any type-specific rules as per your existing code
    ..

    // add to list
    objList.Add(objectDefaultValue);
}