2009-11-16 164 views
0

我在一个类似于下面的设置的对象中有一个MyType类型的数组,我希望能够像myObject那样设置一个索引的值,我不能改变MyFunction的。在不知道类型的情况下设置数组值

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

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

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

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

我也没有访问MyType作为静态类型,只有运行时。

任何意见将是伟大的,谢谢。

+0

你怎么能new()它,如果你没有类型? – erikkallen 2009-11-16 20:34:10

回答

1

,就可以把对象的Array并呼吁SetValue它,为它做一个完全非特定对象的方式。这将根据情况&取消箱值类型&做所有必要的数组类型检查。

+0

谢谢这工作完美! – Chris 2009-11-18 12:20:50

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 

注意你将失去类型安全。

4

申报myObjectArrayobject秒的数组:

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有一个参数的构造函数。有办法解决这个问题,但这应该足以让你开始。这种方法也可能需要一个更好的名字。

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

+0

我已澄清问题,我无法控制我最初如何看待myObjectArray - 它作为一个对象而不是对象[] – Chris 2009-11-16 16:01:52

+0

@Chris:请参阅以“或者,如果由于某种原因...”开头的注释。 – jason 2009-11-16 16:05:36

+0

谢谢杰森。然而,我尝试了类似的东西,我得到了一个错误“无法投射'System.Boolean []'类型的对象来键入'System.Object []'”。 – Chris 2009-11-16 16:38:54

0

在这种情况下,你需要强制转换为object[]

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

OP说他不能投到对象[] – 2009-11-16 20:25:43

0

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

相关问题