将 int[] 转换为 MyType[],其中 MyType 继承自 Enum?

Cast int[] into MyType[] where MyType inherited from Enum?

我尝试将一个 int 数组 int[] 转换为 Rights 数组 Rights[]RightsEnum 例如...但它可以是不是权利的其他类型,但总是继承自 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);
}