2009-11-16 129 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();也許?

相關問題