获取枚举类型并创建该类型的列表,获取 class 类型并使用反射创建该类型的列表
Get enum type and create list of that type , Get class type and create a list with that type with reflection
我正在尝试创建一个工具,它通过反射调用库中的所有函数,为此我需要获取方法信息和参数信息。我能够获得这些参数信息(具有默认值,例如如果它是 int =0, string = empty, float = 0, enum = getting a type values and 0 index value ,如果参数是某种类型(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 ,创建实例,在初始化后将其添加到一个列表(它不应该是 null 那是我在这个程序中唯一的 objective
如有任何帮助,我们将不胜感激
部分代码示例(请注意上面定义的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;
}
我想你的意思是这样的:
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);
}
我正在尝试创建一个工具,它通过反射调用库中的所有函数,为此我需要获取方法信息和参数信息。我能够获得这些参数信息(具有默认值,例如如果它是 int =0, string = empty, float = 0, enum = getting a type values and 0 index value ,如果参数是某种类型(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 ,创建实例,在初始化后将其添加到一个列表(它不应该是 null 那是我在这个程序中唯一的 objective
如有任何帮助,我们将不胜感激
部分代码示例(请注意上面定义的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;
}
我想你的意思是这样的:
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);
}