2012-11-08 84 views
1

我想要讓我可以分配值給多個變量的make方法。我不知道我會有多少變數,但我知道他們的類型。這些變量可以都是不同的類型。分配方法內的變量值

我對此有相當多的瞭解,並且很確定這不能用託管代碼完成。 (糾正我,如果我錯了,雖然)

我不知道很多(讀:什麼)不安全的代碼。可以這樣做嗎?也許傳遞一個指向我想要初始化的變量的指針數組,並以這種方式進行操作?

我基本上在尋找一種方法來將任意數量的混合類型變量傳遞給一個方法,並在方法內分配它們的值...它是否在天空中餡餅?

編輯1:

下面是一些代碼,我希望說明我想達到的目標:SetVariables已執行

private void SomeMethod() 
{ 
    string a = string.empty; 
    int b = 0; 
    double c = 0; 

    object[] testObject = new object[] { b, c }; 

    SetVariables(ref testObject); 
} 

public static void SetVariables(ref object[] Variables) 
{ 
    for (int i = 0; i < Variables.Length; i++) 
     Variables[i] = // The value the variable needs to have 
} 

後,A,B和C會說:

a = "Some text" 
b = 123 
c = 1564.653 

我正在尋找一種方法來訪問作爲參數傳遞給SetVariables的變量並修改它們的值。我想這意味着訪問他們在內存中的存儲位置,因此我認爲我可能需要指針?

編輯2:

My question here應該給在我試圖做到這一點的情況下的一個更好的指標。

我只會處理基本類型:字符串,整型,雙精度和布爾變量我想分配給。

我從中分配的數據是文本格式,並具有可變數量的字段。每個字段都應該按照傳遞變量的順序映射到其中一個輸入變量。如果順序不匹配,最好會出現錯誤分配或者最差的類型錯誤,但是由用戶決定確保變量與數據匹配。

+3

將它們的值分配給什麼,到底是什麼?這個問題非常模糊。你能僞造你想要做的事嗎?你可以通過'List '或'object []'到你的方法嗎? – CodingWithSpike

+0

是的,這就是我迄今一直在嘗試做的事情,但我無法讓變量以這種方式改變。我將編輯並添加一些代碼。 –

+0

通過什麼方法可以知道變量的類型和初始化它們的值,但沒有關於它們的數量或順序?給定類型的所有變量都設置爲相同的默認值嗎? –

回答

1

鏈接什麼你正在嘗試做的並不在C#中很好地工作。這真的是一種語言的東西,而不是「管理與未管理」的東西。

它通常沒有那麼多,因爲在你的示例代碼中,你確實知道你有2個變量。你必須輸入它們才能將它們輸入到數組中。

如果SetVariables()將從代碼中的很多地方以不同數量的參數被調用,那麼您可以對該方法進行一堆重載(包括1個參數,2個參數,3個參數等)。

但說實話,通常當你遇到這種情況時,這是因爲你在以一種不明智的方式做某件事。

思考更多地瞭解它,怎麼會行:

Variables[i] = // The value the variable needs to have 

將預期在這種情況下工作。它如何知道要設置一個任意變量,因爲它可以是任何類型的?此外,如果我將變量b, c中的呼叫更改爲反轉,會怎樣阻止變動分配?

邏輯上,它開始分崩離析。

我想我想說的是,C#不支持這一點,但它通常不需要,因爲它很少有意義。


無論如何都試圖想到一個工作解決方案;我只需要SetVariables只返回值,但不參與參數。應該是另一個函數的工作來分配它的變量。如果你需要知道的類型,那麼你只需要把這個類型:

public object[] GetValues(params Type types) 
{ 
    var result = new object[types.length]; 
    for (int i = 0; i < types.length; i++) 
    { 
     if(types[i] == typeof(string)) 
      result[i] = "foo"; 
     if(types[i] == typeof(int)) 
      result[i] = -1; 
    } 
    return result; 
} 

public void DoStuff() 
{ 
    var data = GetValues(typeof(string), typeof(int), typeof(string)); 
    string foo1 = (string)data[0]; 
    int someNumber = (int)data[1]; 
    string foo2 = (string)data[2]; 
} 

它醜陋,但它的作品...

+0

謝謝,這就是我到目前爲止,但我想知道是否有一種方法可以繞過必須分配每個變量的函數外。我認爲,如果fortran可以通過每個變量byref,那麼可能有一種方法可以在C#中模擬,但如果沒有,那麼就沒有。我會把這個標記爲明天的答案,除非在那之前有更好的東西出現:) –

0

我認爲你自己很接近答案。假設分配給變量的值只是根據關閉它是什麼類型,然後假設你使用你發佈你上面的代碼可以用typeof運算(比較值的類型)在您的for循環檢查:

if(Variables[i].GetType() == typeof(int)){ 
    //...do stuff 
} 

//etc...until you have an if for each data type you expect you might find 

這裏是將typeof documentation

我假設你已經看過了如何使用引用類型,但爲了以防萬一看here

+0

謝謝,但這並不完全是我所問; –

1

這是改編自this answer to a similar question一個例子,不幸的是你的問題是有點困難解決並且真的沒有一種簡單的方法來實現你想要的。

private static void SomeMethod() { 
    string a = string.Empty; 
    int b = 0; 
    double c = 0; 

    SetVariables(x => a = (string)x 
       , x => b = (int)x 
       , x => c = (double)x); 

    Console.WriteLine("a: {0}\nb: {1}\nc: {2}", a, b, c); 
} 

public static void SetVariables(params Action<object>[] setters) { 
    var tokens = new object[] { "Hello", 10, 14.235 }; 
    for (int i = 0; i < setters.Length; i++) 
     setters[i](tokens[i]); // Assumed this is read and initialized properly 
} 

我承認這有一個有點氣味給它的,但因爲你真的要考慮的變量輸入它應該讓你更接近你想要什麼不會增加複雜過量。

+0

這很好,我喜歡它,儘管它在執行方法之後實際上和做任務時一樣,就像在CodingWithSpike的答案中一樣(和我一樣在此刻做)。不過,我可能會將其作爲替代形式來實現。你的答案教給我一些新的編碼:) –

+0

@ user643192很酷,很高興它至少對你有用! –