如何刷新一个充满返回的方法调用值的数组?

时间:2016-03-30 15:21:11

标签: c# arrays

在C#中,我有一个字符串数组,我已经写满了#34; getter"方法调用。他们在另一个类中调用方法,以便使用所需的字符串填充数组。它看起来像这样:

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

我确定这种情况适用于任何程序。但是,在我的程序中,这些方法返回的变量最初是使用字符串"Unchecked"设置的 - 因此用未经检查的3次填充此示例数组。当我的程序继续进行并检查事物时,字符串变量的值会在他们所在的类中发生变化。我只是在适当的时候重新调用getter方法来改变'在我的数组中,像这样:

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

我不是很喜欢这个。似乎不可避免的是,有一天我必须改变一些东西,如果发生这种情况,我将不得不手动完成改变整个程序中所有索引的繁琐工作。如果这是我最好的方式,但我认为有更好的方法。所以,无论如何,有一种方式来刷新"像这样设置的数组中的值?如果是这样,它是什么?

4 个答案:

答案 0 :(得分:2)

你想要这样的东西:

Private Sub SaveAsCSV(Filename As String, Directory As String, Sheet As Object)
    Dim Zeile As Object, Zelle As Object
    Dim strTemp As String
    Const adSaveCreateOverWrite = 2
    Const adTypeText = 2
    Dim Range2Save
    Set Range2Save = CreateObject("ADODB.Stream")
    Range2Save.Charset = "UTF-8"
    Range2Save.Type = adTypeText
    Range2Save.Open

    If Sheet.PageSetup.PrintArea <> "" Then
        Open Directory & Filename For Output As #1
        Sheet.Select
        For Each Zeile In Range(Sheet.PageSetup.PrintArea).Rows
            For Each Zelle In Zeile.Cells
                If InStr(1, Zelle.Text, Separator) > 0 Then
                    'Zellen, die das Trennzeichen beinhalten in Anführungsstriche setzen
                     Range2Save.WriteText "special characters: äöüß"
                     strTemp = strTemp & "" & CStr(Zelle.Text) & "" & ";"
                     Range2Save.WriteText strTemp, 1
                     Range2Save.SaveToFile Filename, adSaveCreateOverWrite
                Else
                    strTemp = strTemp & CStr(Zelle.Text) & Separator
                End If
            Next
            Print #1, strTemp
            strTemp = ""
        Next
        MsgBox ("Print areas of sheet '" & Sheet.Name & "' saved as '" & Directory & Filename & "'")
    End If
    Range2Save.Close
    Close #1
    Set Range2Save = Nothing
End Sub

然后使用MCalls,就好像它是一个常规变量,只要你想访问数组

答案 1 :(得分:1)

您可以将数组更改为包含函数而不是像这样的字符串:

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

然后以这种方式使用它:

string c2 = mCalls[1]();

但请注意,每次访问都是一种方法调用。我不确定你真正想要达到的目标,总体设计可能比这种方法更好。

答案 2 :(得分:0)

几个选项:

创建一个lambdas数组:

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

如果每个lambda的输入相同,您可以创建一个返回数组的lambda:

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

然后通过调用lambda:

重新加载数组
mCalls = GetValues(c);

请注意,从技术上来说,刷新数组并不会创建数组。如果你需要保持数组相同,只需更新你要循环数组的值并按索引分配值。

答案 3 :(得分:0)

你可以做的是用反射循环,从类中获取所有方法,从这里你可以得到一个方法名列表。使用此列表,您可以分配给数组或按名称或其他方式运行方法。您还可以过滤列表以仅获取特定的方法名称:

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" });
}