繁体   English   中英

C#从类的方法中获取所有返回值

[英]C# Get all return values from methods of a class

我有一个class有一定数量的方法return相同object类型。 我想从class return所有方法的所有值。 例如:我有一个名为 Class1 的类,其中包含 Method1、Method2 和 MapActivity,每个方法 1 和 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
    }
}

首先,您的代码不可编译 - 您返回的是 string 而不是 int 并且您在 switch 中有重复的 case 值。

其次。 你根本不想这样做。 实现这一点的唯一方法是解析方法的主体(也可能是代码的其他部分)。 但这仅在某些条件下有效 - 您必须仅使用本地或静态值等。除非您编译和运行代码,否则您将永远无法获得任何动态值。

如果将 switch 变量限制为某种有限枚举,则可以解决您的问题。 在这种情况下,您可以遍历枚举,使用枚举的每个值调用方法,然后您将获得所有可能的返回值。 如果是这种情况,可以像这样循环遍历枚举值:

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

方法 2 也是如此。


编辑问题后,代码应如下所示:

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

然后您将有两个我/他的活动列表,您可以检查代码是否与您的数据库值匹配,如下所示:

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

涵盖整个问题。 如果要访问类的私有方法,则必须使用反射。

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

只需将最后一个代码(带有反射)与前一个代码合并……这取决于您想对输出完全做什么。

您还应该为“错误”值使用某种变量,然后在条件语句中使用它:

private static string ErrorValue = "error";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM