将int []转换为MyType [],其中MyType是从Enum继承的?

时间:2015-08-30 16:29:52

标签: c# arrays reflection enums

我尝试将一个int数组int[]转换为Rights数组Rights[]Rights通过示例Enum ...但它可以是其他类型比权利,但总是从Enum继承。 我在Type变量中得到了最终类型。 我可以为Enum[]创建Rights[]数组,但不能创建最终的methodInfo.Invoke(obj,param.ToArray())数组。

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[]
}

感谢您帮助我!

1 个答案:

答案 0 :(得分:1)

您需要创建适当类型的数组。由于在编译时不知道类型,因此必须使用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);
}