2015-01-01 60 views
2

我想創建一個工具,它通過反射調用庫中的所有函數,爲此我需要獲取方法信息和參數信息。我能夠得到這些參數信息(如果它是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),用於列表class_Default =獲得的類型,創建實例,把它添加到一個列表初始化之後(它不應該是空那就是隻是我在這個計劃目標。

任何幫助,將不勝感激

一些代碼示例(請注意,上述定義的名稱無關,與下面的例子)

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; 
     } 

編輯

我想在這個函數的每個參數,但對於列表在這裏創建默認值,我不知道什麼必須做的功能

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; 

    } 

回答

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); 
} 
+0

謝謝你這爲我工作。 :) – ansar