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