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