C# 基于单独的值实现要调用的方法

C# 基于单独的值实现要调用的方法,c#,inheritance,methods,abstract,C#,Inheritance,Methods,Abstract,基于与方法参数没有直接关系的变量运行方法的最佳方式是什么 例如,如果我有一个接受Json或XML的输入,并且我希望使用基于输入类型(XML或Json)的正确方法来解析该输入,那么有什么可能的方法可以做到这一点 一般而言,我将按以下方式实施: StreamReader stream = new StreamReader(InputStream); userInput= stream.ReadToEnd(); if (isJson(userInput)) { MethodA(); } el

基于与方法参数没有直接关系的变量运行方法的最佳方式是什么

例如,如果我有一个接受Json或XML的输入,并且我希望使用基于输入类型(XML或Json)的正确方法来解析该输入,那么有什么可能的方法可以做到这一点

一般而言,我将按以下方式实施:

StreamReader stream = new StreamReader(InputStream);
userInput= stream.ReadToEnd();

if (isJson(userInput))
{
    MethodA();
}
else
{
    MethodB();
}
但是我不喜欢这样做,因为我觉得这有点不成熟,我更愿意这样做

StreamReader stream = new StreamReader(InputStream);
userInput= stream.ReadToEnd();

//get input type and invoke correct method automatically
Method();
我知道我可以用一个抽象类和重写来做类似的事情,但是我不确定如何根据bool初始化它。这可能吗?如果我有更多的检查来运行而不是bool,比如,如果string==“a”执行此操作,如果string==“b”执行此操作,如果string==“C”执行此操作,如果string==“D”执行此操作

我知道我可以通过某种形式的行动图来实现这一点,例如:

InputType inputType = getInputType(userInput);
Dictionary<InputType, Action> actionMap = new Dictionary<InputType, Action>();

actionMap.Add(InputType.Json, MethodA());
actionMap.Add(InputType.XML, MethodB());
actionMap.Add(InputType.Other, MethodC());

if (actionMap.ContainsKey(inputType))
{
   actionMap[inputType]();
}
InputType InputType=getInputType(用户输入);
Dictionary actionMap=新建字典();
Add(InputType.Json,MethodA());
Add(InputType.XML,MethodB());
Add(InputType.Other,MethodC());
if(actionMap.ContainsKey(inputType))
{
动作图[inputType]();
}

但我同样不太喜欢这种方式,还有什么其他方式?我真的更感兴趣的是人们认为正确/最有效/最先进的实现方法。

你要求的是工厂方法。使用从字符串中获得的布尔检查并不总是最好的。根据您选择的条件获得所需的具体类,然后您只需调用

factory.method()

看看这个维基,以获得更多的澄清


从概念上讲,问题的核心在于,你无法摆脱第一个简单的例子。当然,你可以用各种“成熟”的抽象来概括它,但是看看那些开始增长的不必要的复杂性。我会远离“最高级”的解决方案,努力追求简单易懂的东西,即使它还不成熟。不要想太多:)switch语句可以很好地满足您的需要。如果您只打算使用JSON或XML作为输入类型,那么可能更“优雅”对于这样一个简单的场景来说,答案之一中描述的优秀工厂方法这样的解决方案过于抽象(尽管我个人可能会这样做)。然而,如果你能预见到更多的输入类型,那么无论如何,你可以选择更高的层次。是的,对于这样一个简单的真或假,if-else似乎是最合适的,我只是好奇在编码时,如果我有很多条件,是否有一种更优雅的方式来处理它。我会研究工厂的方法,看看是否适合我。谢谢大家!谢谢,我不知道这件事,我会调查一下以备将来参考,干杯!