C# 如何刷新包含方法调用返回值的数组?

C# 如何刷新包含方法调用返回值的数组?,c#,arrays,C#,Arrays,在C#中,我编写了一个字符串数组,其中包含了大量的“getter”方法调用。它们调用另一个类中的方法,以便用所需的字符串填充数组。它看起来像这样: string[] mCalls = {c.get1(), c.get2(), c.get3()}; mCalls[0] = c.get1(); mCalls[1] = c.get2(); mCalls[2] = c.get3(); Func<string>[] mCalls = { c.get1, c.get2, c.get3...}

在C#中,我编写了一个字符串数组,其中包含了大量的“getter”方法调用。它们调用另一个类中的方法,以便用所需的字符串填充数组。它看起来像这样:

string[] mCalls = {c.get1(), c.get2(), c.get3()};
mCalls[0] = c.get1();
mCalls[1] = c.get2();
mCalls[2] = c.get3();
Func<string>[] mCalls = { c.get1, c.get2, c.get3...};
public string[] MCalls
{
    get
    {
        return new string[]{c.get1(), c.get2(), c.get3()};
    }
    private set;
}
我相信这种情况适用于任何项目。但是,在我的程序中,这些方法返回的变量最初是用字符串
“Unchecked”
设置的-因此,用Unchecked填充这个示例数组3次。当我的程序继续运行并进行检查时,字符串变量的值会在它们所在的类中发生更改。我只是在适当的时候重新调用getter方法来更改数组中的内容,如下所示:

string[] mCalls = {c.get1(), c.get2(), c.get3()};
mCalls[0] = c.get1();
mCalls[1] = c.get2();
mCalls[2] = c.get3();
Func<string>[] mCalls = { c.get1, c.get2, c.get3...};
public string[] MCalls
{
    get
    {
        return new string[]{c.get1(), c.get2(), c.get3()};
    }
    private set;
}
我真的不喜欢这个。总有一天我将不得不更改某些内容,如果这种情况发生,我将不得不手动完成整个程序中所有索引更改的繁琐工作。如果这是最好的方法,我也同意,但我认为还有更好的方法。那么,在任何情况下,有没有办法“刷新”这样设置的数组中的值?如果是,那是什么?

两个选项:

创建lambda的数组:

var mCalls = new Func<object, string>[] {
    (object o) => o.ToString() ,
    (object o) => o.GetHashCode().ToString(),
    (object o) => o.GetType().ToString(),
 };
请注意,从技术上讲,它不是在刷新阵列,而是在创建一个新阵列。如果需要保持数组不变,但只需更新循环数组所需的值,并按索引分配值。

两个选项:

创建lambda的数组:

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

请注意,从技术上讲,它不是在刷新阵列,而是在创建一个新阵列。如果需要保持数组不变,但只需更新循环数组所需的值并按索引分配值。

您可以将数组更改为包含函数而不是字符串,如下所示:

string[] mCalls = {c.get1(), c.get2(), c.get3()};
mCalls[0] = c.get1();
mCalls[1] = c.get2();
mCalls[2] = c.get3();
Func<string>[] mCalls = { c.get1, c.get2, c.get3...};
public string[] MCalls
{
    get
    {
        return new string[]{c.get1(), c.get2(), c.get3()};
    }
    private set;
}

但请注意,这样一来,每个访问都是一个方法调用。我不确定您真正想要实现的是什么,可能有比这种方法更好的总体设计。

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

string[] mCalls = {c.get1(), c.get2(), c.get3()};
mCalls[0] = c.get1();
mCalls[1] = c.get2();
mCalls[2] = c.get3();
Func<string>[] mCalls = { c.get1, c.get2, c.get3...};
public string[] MCalls
{
    get
    {
        return new string[]{c.get1(), c.get2(), c.get3()};
    }
    private set;
}

但请注意,这样一来,每个访问都是一个方法调用。我不确定您真正想要实现的是什么,可能有比这种方法更好的总体设计。

您想要这样的东西:

string[] mCalls = {c.get1(), c.get2(), c.get3()};
mCalls[0] = c.get1();
mCalls[1] = c.get2();
mCalls[2] = c.get3();
Func<string>[] mCalls = { c.get1, c.get2, c.get3...};
public string[] MCalls
{
    get
    {
        return new string[]{c.get1(), c.get2(), c.get3()};
    }
    private set;
}

然后,只要您想访问数组,就可以像使用正则变量一样使用mcall

string[] mCalls = {c.get1(), c.get2(), c.get3()};
mCalls[0] = c.get1();
mCalls[1] = c.get2();
mCalls[2] = c.get3();
Func<string>[] mCalls = { c.get1, c.get2, c.get3...};
public string[] MCalls
{
    get
    {
        return new string[]{c.get1(), c.get2(), c.get3()};
    }
    private set;
}

然后使用mcall,就好像它是一个正则变量一样,每当你想访问数组时

你能做的就是用反射循环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" });
}

您可以做的是使用反射循环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" });
}

可以将mCalls设为属性,getter返回一个数组,该数组是方法调用的结果。这样,您只需在发生任何更改时更新getter,就可以创建一个全局方法,将
mCalls
作为输入(或引用),然后在其中运行其他方法。这在技术上与您现在所做的相同,但需要更少的重复代码,以便
mCalls[0]=c.get1();mcall[1]=c.get2();mcall[2]=c.get3()可以替换为
getmcall(参考mcall)(示例方法名称中的GetMCalls)您没有一个充满方法调用的数组。您有一个充满字符串的数组,其中的字符串来自方法调用。您的数组中不存在方法调用。另外,需要澄清的是,数组不包含对方法的调用。这将意味着某种函数指针符合C/C++或不安全的C#。数组索引包含方法调用的返回值。@user9993或C#world中的委托,如Func或Action。您可以将mCalls设置为属性,getter返回方法调用的结果数组。这样,您只需在发生任何更改时更新getter,就可以创建一个全局方法,将
mCalls
作为输入(或引用),然后在其中运行其他方法。这在技术上与您现在所做的相同,但需要更少的重复代码,以便
mCalls[0]=c.get1();mcall[1]=c.get2();mcall[2]=c.get3()可以替换为
getmcall(参考mcall)(示例方法名称中的GetMCalls)您没有一个充满方法调用的数组。您有一个充满字符串的数组,其中的字符串来自方法调用。您的数组中不存在方法调用。另外,需要澄清的是,数组不包含对方法的调用。这将意味着某种函数指针符合C/C++或不安全的C#。数组索引包含方法调用的返回值。@user9993或C#world中的委托,如Func或Action。在我的代码中,我无法在我的
Main
中执行此操作,因此我将其与所有变量一起放入类中,将其设置为私有,并用变量名本身替换
C.getx()
。我创建了一个string[]方法,如
getMCalls()
,用于返回数组。我不得不拿出
私人套装。无论如何,谢谢你的帮助@Gordon,我忘了我能做到!在我的代码中,我无法在我的
Main
中实现这一点,因此我将其与所有变量一起放入类中,将其设置为私有,并将
c.getx()
替换为变量名本身。我创建了一个string[]方法,如
getMCalls()
,用于返回数组。我不得不拿出
私人套装。无论如何,谢谢你的帮助@Gordon,我忘了我能做到!