C# 如何刷新包含方法调用返回值的数组?
在C#中,我编写了一个字符串数组,其中包含了大量的“getter”方法调用。它们调用另一个类中的方法,以便用所需的字符串填充数组。它看起来像这样: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...}
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,我忘了我能做到!