在C#中,我编写了一个字符串数组,其中充满了"getter"方法调用。它们调用另一个类中的方法,以便用所需的字符串填充数组。它看起来像这样:
string[] mCalls = {c.get1(), c.get2(), c.get3()};
我相信这种情况适用于任何项目。然而,在我的程序中,这些方法返回的变量最初是用字符串"Unchecked"
设置的,因此在这个示例数组中填充了3次Unchecked。随着程序的运行和检查,字符串变量的值在它们所在的类中会发生变化
mCalls[0] = c.get1();
mCalls[1] = c.get2();
mCalls[2] = c.get3();
我真的不喜欢这个。似乎不可避免的是,有一天我必须更改某些内容,如果发生这种情况,我将不得不手动更改整个程序中的所有索引。如果这恰好是最好的方法,我可以接受,但我认为还有更好的方法。那么,在任何情况下,有没有办法"刷新"这样设置的数组中的值?如果是,那是什么?
您想要这样的东西:
public string[] MCalls
{
get
{
return new string[]{c.get1(), c.get2(), c.get3()};
}
private set;
}
然后每当您想访问数组
您可以更改数组以包含函数,而不是像这样的字符串:
Func<string>[] mCalls = { c.get1, c.get2, c.get3...};
然后以这种方式使用:
string c2 = mCalls[1]();
但请注意,通过这种方式每个访问都是一个方法调用。我不确定你真正想要实现的是什么,可能有比这种方法更好的整体设计。
几个选项:
创建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);
请注意,从技术上讲,它不是刷新数组,而是创建一个新阵列。如果你需要保持数组不变,但只更新你想要的值,那么你可以在数组中循环并通过索引分配值。
您可以做的是用反射循环thorough,并从类中获取所有方法,从这里您可以获得方法名称列表。使用此列表,您可以按名称或其他方式为数组赋值或运行方法。您也可以过滤列表,只获取您的特定方法名称:
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" });
}