2016-03-30 42 views
0

在C#中,我有一個字符串數組,我已經寫滿了「getter」方法調用。他們在另一個類中調用方法,以便數組填充所需的字符串。它看起來像這樣:如何刷新一個完整的方法調用返回值的數組?

string[] mCalls = {c.get1(), c.get2(), c.get3()}; 

我確信這種情況可能適用於任何程序。但是,在我的程序中,這些方法返回的變量最初是使用字符串"Unchecked"設置的 - 因此使用Unchecked填充此示例數組3次。當我的程序繼續執行並且檢查事物時,字符串變量的值在它們所在的類中發生了變化。我一直在適當的時候重新調用getter方法來更改數組中的內容,如下所示:

mCalls[0] = c.get1(); 
mCalls[1] = c.get2(); 
mCalls[2] = c.get3(); 

我不太喜歡這樣。看來不可避免的是,有一天我不得不改變一些事情,如果發生這種情況,我將不得不手動完成在整個程序中更改所有索引的乏味工作。如果這恰好是最好的方式,但我認爲有更好的方法。所以,在任何情況下,有沒有辦法「刷新」這樣設置的數組中的值?如果是這樣,那是什麼?

+0

您可以mCalls屬性和getter方法會返回一個數組,它是的結果方法調用。這樣你只需要更新getter就可以改​​變 –

+0

你可以創建一個將mCalls作爲輸入(或ref)的全局方法,然後在其中運行其他方法。這在技術上與你現在正在做的是一樣的,但是需要更少的重複代碼,所以mCalls [0] = c.get1(); mCalls [1] = c.get2();可以用 來代替; GetMCalls(ref mCalls);可以用 代替。 '(在示例方法名稱中使用GetMCalls) –

+1

您沒有充滿方法調用的數組。你有一個數組,其中的字符串來自一個方法調用。方法調用不存在於你的數組中。 – CathalMF

回答

2

你想是這樣的:

public string[] MCalls 
{ 
    get 
    { 
     return new string[]{c.get1(), c.get2(), c.get3()}; 
    } 
    private set; 
} 

,然後當你要訪問的陣列使用MCalls,就好像它是一個普通的可變

+0

在我的代碼中,我無法在我的'Main'中完成這項工作,所以我將它放入帶有所有變量的類中,使其成爲私有的,並用變量名稱本身替換了'c.getx()'。我做了一個string []方法,如'getMCalls()'返回數組。我不得不拿出「私人套裝」。無論如何,感謝@戈登的幫助,我忘了我可以做到這一點! – Alamb

0

兩個選擇:

創建lambda表達式的數組:

var mCalls = new Func<object, string>[] { 
    (object o) => o.ToString() , 
    (object o) => o.GetHashCode().ToString(), 
    (object o) => o.GetType().ToString(), 
}; 

如果輸入到每個拉姆達是,你可以創建一個返回數組拉姆達相同:

Func<object, string[]> GetValues = (object o) => new string[] 
{ 
    o.ToString() , 
    o.GetHashCode().ToString(), 
    o.GetType().ToString(), 
}; 

然後通過調用lambda重新加載數組:

mCalls = GetValues(c); 

請注意,它不是技術上刷新陣列,它創建一個新的陣列。如果你需要保持數組相同,但只是更新你想要循環訪問數組的值並按索引分配值。

1

你可以改變你數組包含函數的字符串而不是像這樣:

Func<string>[] mCalls = { c.get1, c.get2, c.get3...}; 

,然後用它是這樣的:

string c2 = mCalls[1](); 

但是請注意,這樣訪問是方法調用。我不確定你真正想要達到的是什麼,可能會有比這種方法更好的整體設計。

0

你可以做的是循環thorugh與反思,並得到所有來自這個類的方法和從這裏你都可以得到一個方法名列表。有了這個列表,你可以分配給一個數組,或者通過名稱或其他方式運行這些方法。您還可以過濾列表,從而只得到您的具體方法名稱:

var methodNames = typeof(MyClass).GetMethods(BindingFlags.Public | BindingFlags.Static) 
          .Select(x => x.Name) 
          .Distinct() 
          .OrderBy(x => x); 

調用的方法:

foreach(var method in methodNames) 
{ 
    typeof(MyClass).GetMethod(method).Invoke(t, new[] { "world" }); 
} 
相關問題