我在一个类似于下面的设置的对象中有一个MyType数组,我希望能够在myObject上设置索引的值,我不能更改MyFunction的声明。
/*...*/
MyType [] myTypedArray = new MyType[100];
MyFunction(myTypedArray);
/*...*/
function MyFunction(object myObject)
{
myObject[0] = new MyType();
}
这显然不起作用,但我无法弄清楚如何让它发挥作用。我不能使用模板/泛型,它必须全部使用反射。
请注意,我最初必须将myObjectArray作为“对象”,因为这是我收到它的方式。我无法对对象[]进行初始强制转换。我已经尝试将myObjectArray转换为object []并且它不起作用。
我也无法将MyType作为静态类型访问,只能访问运行时。
任何建议都会很棒,谢谢。
答案 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();
?