设置数组值而不知道其类型

时间:2009-11-16 15:54:25

标签: c# .net reflection

我在一个类似于下面的设置的对象中有一个MyType数组,我希望能够在myObject上设置索引的值,我不能更改MyFunction的声明。

/*...*/
MyType [] myTypedArray = new MyType[100];
MyFunction(myTypedArray);
/*...*/

function MyFunction(object myObject)
{
    myObject[0] = new MyType();
}

这显然不起作用,但我无法弄清楚如何让它发挥作用。我不能使用模板/泛型,它必须全部使用反射。

请注意,我最初必须将myObjectArray作为“对象”,因为这是我收到它的方式。我无法对对象[]进行初始强制转换。我已经尝试将myObjectArray转换为object []并且它不起作用。

我也无法将MyType作为静态类型访问,只能访问运行时。

任何建议都会很棒,谢谢。

5 个答案:

答案 0 :(得分:4)

myObjectArray声明为object s:

的数组
object[] myObjectArray = myTypedArray;
myObjectArray[0] = new MyType(); // okay to go!

或者,如果出于某种原因,myObjectArray必须是object,您可以说:

((object[])myObjectArray)[0] = new MyType();

但这些都很臭。并注意array covariance in C#

以下是您似乎正在寻找的实施方案:

void AddToArray(object array, int index) {
    if(array == null) {
        throw new ArgumentNullException();
    }
    Type arrayType = array.GetType();
    if(!arrayType.IsArray) {
        throw new InvalidOperationException("array must be an Array");
    }

    (Array)asArray = (Array)array;
    if (index < 0 || index >= asArray.Length) {
        throw new ArgumentOutOfRangeException("index");
    }
    object newInstance = Activator.CreateInstance(elementType);
    asArray.SetValue(newInstance, index);
}

调用为:

AddToArray(myObjectArray, 0);

这假定elementType具有无参数构造函数。有很多方法,但这应该足以让你开始。这种方法也可能需要更好的名称。

同样,这段代码非常臭。我建议退一步看看你是否可以使用强类型代码解决问题。

答案 1 :(得分:1)

尝试类似:

DayOfWeek[] myTypedArray = Enum.GetValues(typeof(DayOfWeek))
                               .OfType<DayOfWeek>().ToArray();
object myObject = myTypedArray;

object[] myObjectArray =   // from object to object[]
        (myObject as Array ?? new object[0]).OfType<object>().ToArray();

Type type = myObjectArray[0].GetType(); // unbox type
myObjectArray[0] = Activator.CreateInstance(type); // create another instance

请注意,您将失去类型安全性。

答案 2 :(得分:1)

您可以将对象强制转换为Array并在其上调用SetValue,以获得完全非特定于对象的方式。这个'盒子&amp;适当的unbox值类型&amp;做所有必要的数组类型检查。

答案 3 :(得分:0)

在这种情况下,您需要转换为object[]

((object[])myObjectArray)[0] = new MyType();

答案 4 :(得分:0)

或许

((MyType[])myObjectArray)[0] = new MyType();