C# 在不知道其类型的情况下设置数组值

C# 在不知道其类型的情况下设置数组值,c#,.net,reflection,C#,.net,Reflection,我在一个类似于下面设置的对象中有一个MyType s数组,我希望能够按原样设置myObject上的索引值,我无法更改MyFunction的声明 /*...*/ MyType [] myTypedArray = new MyType[100]; MyFunction(myTypedArray); /*...*/ function MyFunction(object myObject) { myObject[0] = new MyType(); } 这显然不起作用,但我不知道如何让它发挥

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

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

function MyFunction(object myObject)
{
    myObject[0] = new MyType();
}
这显然不起作用,但我不知道如何让它发挥作用。我不能使用模板/泛型,必须全部使用反射

请注意,我必须首先将myObjectArray作为一个“对象”,因为这是我接收它的方式。我无法对对象[]进行初始强制转换。我已尝试将myObjectArray强制转换为object[],但它不起作用

我也不能作为静态类型访问MyType,只能访问运行时

任何建议都很好,谢谢。

试试以下方法:

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
DayOfWeek[]myTypedArray=Enum.GetValues(typeof(DayOfWeek))
.OfType().ToArray();
对象myObject=myTypedArray;
对象[]myObjectArray=//从对象到对象[]
(myObject作为数组??新对象[0]),类型为().ToArray();
类型Type=myObjectArray[0]。GetType();//拆箱类型
myObjectArray[0]=Activator.CreateInstance(类型);//创建另一个实例
注意,您将失去类型安全性。

请尝试以下操作:

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
DayOfWeek[]myTypedArray=Enum.GetValues(typeof(DayOfWeek))
.OfType().ToArray();
对象myObject=myTypedArray;
对象[]myObjectArray=//从对象到对象[]
(myObject作为数组??新对象[0]),类型为().ToArray();
类型Type=myObjectArray[0]。GetType();//拆箱类型
myObjectArray[0]=Activator.CreateInstance(类型);//创建另一个实例

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

myObjectArray
声明为
对象的数组:

object[] myObjectArray = myTypedArray;
myObjectArray[0] = new MyType(); // okay to go!
或者,如果出于某种原因
myObjectArray
必须是
对象
,您可以说:

((object[])myObjectArray)[0] = new MyType();
不过这些很臭。小心

下面是一个您似乎正在寻找的实现:

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);
}
这假设
elementType
具有无参数构造函数。有办法解决这个问题,但这应该足以让你开始。此方法可能还需要更好的名称


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

myObjectArray
声明为
对象的数组:

object[] myObjectArray = myTypedArray;
myObjectArray[0] = new MyType(); // okay to go!
或者,如果出于某种原因
myObjectArray
必须是
对象
,您可以说:

((object[])myObjectArray)[0] = new MyType();
不过这些很臭。小心

下面是一个您似乎正在寻找的实现:

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);
}
这假设
elementType
具有无参数构造函数。有办法解决这个问题,但这应该足以让你开始。此方法可能还需要更好的名称


同样,这个代码很臭。我建议您后退一步,看看是否可以使用强类型代码解决问题。

在这种情况下,您需要转换到
对象[]

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

在这种情况下,您需要强制转换到
对象[]

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

您可以将对象强制转换为
数组
并调用它,以实现完全非对象特定的方式。这将根据需要装箱和取消装箱值类型,并执行所有必要的数组类型检查。

您可以将对象强制转换为
数组
并调用它,以获得一种完全不特定于对象的方式。这将根据需要装箱和取消装箱值类型,并执行所有必要的数组类型检查。

((MyType[])myObjectArray)[0]=new MyType()也许?

((MyType[])myObjectArray)[0]=新的MyType()也许?

我已经澄清了这个问题,我无法控制我最初是如何看待myObjectArray的-它是作为一个对象而不是一个对象出现的[]@Chris:请参阅以“或者,如果出于某种原因……”开头的评论。谢谢Jason。然而,我尝试了类似的方法,结果出现了一个错误“无法将'System.Boolean[]类型的对象强制转换为'System.object[]”。克里斯:是的,这是因为
bool
是一种值类型。CLR绝不允许将元素为值类型的数组强制转换为任何其他数组类型。所以
string[]strings=新字符串[n];对象o=字符串;对象[]数组=(对象[])o合法,但
bool[]bools=新bool[n];对象o=布尔;对象[]数组=(对象[])o不是。你知道我能做什么吗?数组类型可以是任何类型?(注意这是我自己的序列化内容)我已经澄清了这个问题,我无法控制我最初是如何看待myObjectArray的-它是作为一个对象而不是一个对象出现的[]@Chris:请参阅以“或者,如果出于某种原因……”开头的评论。谢谢Jason。然而,我尝试了类似的方法,结果出现了一个错误“无法将'System.Boolean[]类型的对象强制转换为'System.object[]”。克里斯:是的,这是因为
bool
是一种值类型。CLR绝不允许将元素为值类型的数组强制转换为任何其他数组类型。所以
string[]strings=新字符串[n];对象o=字符串;对象[]数组=(对象[])o合法,但
bool[]bools=新bool[n];对象o=布尔;对象[]数组=(对象[])o不是。你知道我能做什么吗?数组类型可以是任何类型?(注意,这是我自己的序列化内容)OP说他不能强制转换到对象[]OP说他不能强制转换到对象[]如果没有类型,你怎么能新建()它?如果没有类型,你怎么能新建()它?