将 int[] 转换为 MyType[],其中 MyType 继承自 Enum?
Cast int[] into MyType[] where MyType inherited from Enum?
我尝试将一个 int 数组 int[]
转换为 Rights
数组 Rights[]
,Rights
是 Enum
例如...但它可以是不是权利的其他类型,但总是继承自 Enum
。
我在 Type
变量中得到了最终类型。
我可以为 methodInfo.Invoke(obj,param.ToArray())
.
创建 Enum[]
数组,但不能创建最终的 Rights[]
数组
List<object> param = new List<object>();
ParameterInfo pi = ...
if (pi.ParameterType.IsArray && pi.ParameterType.GetElementType().IsEnum)
{
List<Enum> enums = new List<Enum>();
foreach (int i in GetTabInt())
{
enums.Add((Enum)Enum.ToObject(pi.ParameterType.GetElementType(), i));
}
param.Add(enums.ToArray()); // got Enum[] not Rights[]
}
谢谢你帮助我!
您需要创建一个适当类型的数组。由于类型在编译时未知,因此必须使用 Array.CreateInstance()
。您可以使用这个辅助方法。
public Array ToEnumArray(Type type, ICollection values)
{
if (!typeof(Enum).IsAssignableFrom(type))
throw new ArgumentException(String.Format("Type '{0}' is not an Enum", type));
var result = Array.CreateInstance(type, values.Count);
var i = 0;
foreach (var value in values)
result.SetValue(Enum.ToObject(type, value), i++);
return result;
}
然后你就可以这样使用了:
ParameterInfo pi = ...;
if (pi.ParameterType.IsArray && pi.ParameterType.GetElementType().IsEnum)
{
var enumArray = ToEnumArray(pi.ParameterType.GetElementType(), GetTabInt());
param.Add(enumArray);
}
我尝试将一个 int 数组 int[]
转换为 Rights
数组 Rights[]
,Rights
是 Enum
例如...但它可以是不是权利的其他类型,但总是继承自 Enum
。
我在 Type
变量中得到了最终类型。
我可以为 methodInfo.Invoke(obj,param.ToArray())
.
Enum[]
数组,但不能创建最终的 Rights[]
数组
List<object> param = new List<object>();
ParameterInfo pi = ...
if (pi.ParameterType.IsArray && pi.ParameterType.GetElementType().IsEnum)
{
List<Enum> enums = new List<Enum>();
foreach (int i in GetTabInt())
{
enums.Add((Enum)Enum.ToObject(pi.ParameterType.GetElementType(), i));
}
param.Add(enums.ToArray()); // got Enum[] not Rights[]
}
谢谢你帮助我!
您需要创建一个适当类型的数组。由于类型在编译时未知,因此必须使用 Array.CreateInstance()
。您可以使用这个辅助方法。
public Array ToEnumArray(Type type, ICollection values)
{
if (!typeof(Enum).IsAssignableFrom(type))
throw new ArgumentException(String.Format("Type '{0}' is not an Enum", type));
var result = Array.CreateInstance(type, values.Count);
var i = 0;
foreach (var value in values)
result.SetValue(Enum.ToObject(type, value), i++);
return result;
}
然后你就可以这样使用了:
ParameterInfo pi = ...;
if (pi.ParameterType.IsArray && pi.ParameterType.GetElementType().IsEnum)
{
var enumArray = ToEnumArray(pi.ParameterType.GetElementType(), GetTabInt());
param.Add(enumArray);
}