[英]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.