C# 从 class 的方法中获取所有 return 值
C# Get all return values from methods of a class
我有一个 class
,其中包含许多 return
相同 object
类型的方法。我想要 class
中所有方法的所有 return
值。例如:我用 Method1、Method2 和 MapActivity class 调用了 Class1,每个 method1 和 2 都有 switch
case
返回某些枚举值。我想从这两种方法中检索所有 return
值。
public static class Class1
{
public static string MapActivity(Human human, Activity activity)
{
switch (human)
{
case Human.Me:
return Method1(activity);
case Human.Him:
return Method2(activity);
default:
return "error";
}
}
public enum Activity
{
Eat,
Sleep,
Game,
Drink,
Poop,
Slack,
}
private static string Method1(Activity myActivity)
{
switch (myActivity)
{
case Activity.Eat:
return "one";
case Activity.Sleep:
return "two";
case Activity.Drink:
return "three";
case Activity.Game:
return "four";
case Activity.Poop:
return "five";
case Activity.Eat:
return "six";
default:
return "error";
}
}
private static string Method2(Activity hisActivity)
{
switch (hisActivity)
{
case Activity.Eat:
return "seven";
case Activity.Sleep:
return "eight";
case Activity.Drink:
return "nine";
case Activity.Slack:
return "ten";
case Activity.Poop:
return "eleven";
case Activity.Game:
return "twelve";
default:
return "error";
}
}
}
public class Class2
{
public void CheckReturnValues()
{
//this is where i want to do my thing
//get all private methods from Class1
//get all return values from those methods
}
}
首先,您的代码不可编译 - 您 returning string 而不是 int 并且在 switch 中有重复的 case 值。
其次。你根本不想那样做。实现此目的的唯一方法是解析方法的主体(也可能是代码的其他部分)。但这仅在某些条件下有效 - 您必须仅使用本地或静态值等。除非您编译并 运行 代码,否则您将永远无法获得任何动态值。
如果将 switch 变量限制为某种有限枚举,则可以解决您的问题。在这种情况下,您可以遍历枚举,使用枚举的每个值调用方法,然后您将获得所有可能的 return 值。如果是这种情况,可以像这样遍历枚举值:
var values = Enum.GetValues(typeof(Foos));
或打字版本:
var values = Enum.GetValues(typeof(Foos)).Cast<Foos>();
然后你只需调用循环内的方法:
var results = new List<string>();
foreach (Foos val in Enum.GetValues(typeof(Foos)).Cast<Foos>())
{
results.Add(Class1.Method1(val));
}
方法二也是如此
编辑问题后,代码应如下所示:
var myActivities = new List<string>();
var hisActivities = new List<string>();
foreach (Activity activity in Enum.GetValues(typeof(Activity)).Cast<Activity>())
{
myActivities.Add(Class1.Method1(activity));
hisActivities.Add(Class1.Method2(activity));
}
然后您将有两个 my/his 活动列表,您可以检查代码是否与您的数据库值匹配,如下所示:
bool myActivitiesHasError = myActivities.Any(x => x == "error")
bool hisActivitiesHasError = hisActivities.Any(x => x == "error")
或者您可以检查循环内的值:
bool myActivitiesHasError = false;
bool hisActivitiesHasError = false;
foreach (Activity activity in Enum.GetValues(typeof(Activity)).Cast<Activity>())
{
if (myActivities.Add(Class1.Method1(activity)) == "error") myActivitiesHasError = true;
if (hisActivities.Add(Class1.Method2(activity)) == "error") hisActivitiesHasError = true;
}
涵盖整个问题。如果你想访问class的私有方法,那么你必须使用反射。
MethodInfo method1 = typeof(Class1).GetMethod("Method1", BindingFlags.NonPublic);
MethodInfo method2 = typeof(Class1).GetMethod("Method2", BindingFlags.NonPublic);
foreach (Activity activity in Enum.GetValues(typeof(Activity)).Cast<Activity>())
{
method1.Invoke(null, activity);
method2.Invoke(null, activity);
}
只需将最后的代码(带有反射)与之前的代码合并...这取决于您要对输出执行的操作。
您还应该为 "error" 值使用某种变量,然后在条件语句中使用它:
private static string ErrorValue = "error";
我有一个 class
,其中包含许多 return
相同 object
类型的方法。我想要 class
中所有方法的所有 return
值。例如:我用 Method1、Method2 和 MapActivity class 调用了 Class1,每个 method1 和 2 都有 switch
case
返回某些枚举值。我想从这两种方法中检索所有 return
值。
public static class Class1
{
public static string MapActivity(Human human, Activity activity)
{
switch (human)
{
case Human.Me:
return Method1(activity);
case Human.Him:
return Method2(activity);
default:
return "error";
}
}
public enum Activity
{
Eat,
Sleep,
Game,
Drink,
Poop,
Slack,
}
private static string Method1(Activity myActivity)
{
switch (myActivity)
{
case Activity.Eat:
return "one";
case Activity.Sleep:
return "two";
case Activity.Drink:
return "three";
case Activity.Game:
return "four";
case Activity.Poop:
return "five";
case Activity.Eat:
return "six";
default:
return "error";
}
}
private static string Method2(Activity hisActivity)
{
switch (hisActivity)
{
case Activity.Eat:
return "seven";
case Activity.Sleep:
return "eight";
case Activity.Drink:
return "nine";
case Activity.Slack:
return "ten";
case Activity.Poop:
return "eleven";
case Activity.Game:
return "twelve";
default:
return "error";
}
}
}
public class Class2
{
public void CheckReturnValues()
{
//this is where i want to do my thing
//get all private methods from Class1
//get all return values from those methods
}
}
首先,您的代码不可编译 - 您 returning string 而不是 int 并且在 switch 中有重复的 case 值。
其次。你根本不想那样做。实现此目的的唯一方法是解析方法的主体(也可能是代码的其他部分)。但这仅在某些条件下有效 - 您必须仅使用本地或静态值等。除非您编译并 运行 代码,否则您将永远无法获得任何动态值。
如果将 switch 变量限制为某种有限枚举,则可以解决您的问题。在这种情况下,您可以遍历枚举,使用枚举的每个值调用方法,然后您将获得所有可能的 return 值。如果是这种情况,可以像这样遍历枚举值:
var values = Enum.GetValues(typeof(Foos));
或打字版本:
var values = Enum.GetValues(typeof(Foos)).Cast<Foos>();
然后你只需调用循环内的方法:
var results = new List<string>();
foreach (Foos val in Enum.GetValues(typeof(Foos)).Cast<Foos>())
{
results.Add(Class1.Method1(val));
}
方法二也是如此
编辑问题后,代码应如下所示:
var myActivities = new List<string>();
var hisActivities = new List<string>();
foreach (Activity activity in Enum.GetValues(typeof(Activity)).Cast<Activity>())
{
myActivities.Add(Class1.Method1(activity));
hisActivities.Add(Class1.Method2(activity));
}
然后您将有两个 my/his 活动列表,您可以检查代码是否与您的数据库值匹配,如下所示:
bool myActivitiesHasError = myActivities.Any(x => x == "error")
bool hisActivitiesHasError = hisActivities.Any(x => x == "error")
或者您可以检查循环内的值:
bool myActivitiesHasError = false;
bool hisActivitiesHasError = false;
foreach (Activity activity in Enum.GetValues(typeof(Activity)).Cast<Activity>())
{
if (myActivities.Add(Class1.Method1(activity)) == "error") myActivitiesHasError = true;
if (hisActivities.Add(Class1.Method2(activity)) == "error") hisActivitiesHasError = true;
}
涵盖整个问题。如果你想访问class的私有方法,那么你必须使用反射。
MethodInfo method1 = typeof(Class1).GetMethod("Method1", BindingFlags.NonPublic);
MethodInfo method2 = typeof(Class1).GetMethod("Method2", BindingFlags.NonPublic);
foreach (Activity activity in Enum.GetValues(typeof(Activity)).Cast<Activity>())
{
method1.Invoke(null, activity);
method2.Invoke(null, activity);
}
只需将最后的代码(带有反射)与之前的代码合并...这取决于您要对输出执行的操作。
您还应该为 "error" 值使用某种变量,然后在条件语句中使用它:
private static string ErrorValue = "error";