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

我有一个class,其中有许多return类型为object的方法。我想要该return中所有方法的所有class值。例如:我有一个名为Class1的类,带有Method1,Method2和Mapactivity,每个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
    }
}
zhang6396608 回答:C#从类的方法获取所有返回值

首先,您的代码不可编译-您返回的是字符串而不是int,并且开关中的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";
本文链接:https://www.f2er.com/2980143.html

大家都在问