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



在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;
}

然后每当您想访问数组

时,使用MCalls,就好像它是一个常规变量一样

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

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

最新更新