一、文件结构及使用到知识点
1、 文件由Program、Operator、OperatorFactory组成。
- Program文件:主函数入口(初始化静态字典,输入流程,动态调用方法,输出结果。)
- Operator文件:Operator抽象类,加减乘除具体实现。
- OperatorFactory文件:工厂动态创建方法。
2、主要使用到的知识点有:反射、向上转型、多态
二、Program.cs代码
using System;
using System.Collections.Generic;
namespace CalculateDemo
{
class Program
{
/// <summary>
/// 记录方法的Dictionary
/// </summary>
static Dictionary<string, string> cfg = new Dictionary<string, string>();
static void Main(string[] args)
{
Load();
while(true)
{
Console.Write("请输入操作数1:");
int x = int.Parse(Console.ReadLine());
Console.Write("请输入操作数2:");
int y = int.Parse(Console.ReadLine());
Console.Write("请输入运算符:");
string op = Console.ReadLine();
Operator opr = OperatorFactory.Create(cfg[op]);
opr.Left = x;
opr.Right = y;
int r = opr.Calc();
Console.WriteLine($"{x}{op}{y}={r}");
}
}
/// <summary>
/// 初始化赋值
/// </summary>
static void Load()
{
cfg.Add("+", "CalculateDemo.AddOperator");
cfg.Add("-","CalculateDemo.SubOperator");
cfg.Add("*", "CalculateDemo.MulOperator");
cfg.Add("/", "CalculateDemo.DivOperator");
}
}
}
三、Operator.cs代码
namespace CalculateDemo
{
abstract class Operator
{
public int Left { get; set; }
public int Right { get; set; }
public abstract int Calc();
}
class AddOperator : Operator
{
public override int Calc()
{
return Left + Right;
}
}
class SubOperator : Operator
{
public override int Calc()
{
return Left - Right;
}
}
class MulOperator : Operator
{
public override int Calc()
{
return Left * Right;
}
}
class DivOperrator : Operator
{
public override int Calc()
{
return Left / Right;
}
}
}
四、OperatorFactory.cs代码
using System;
using System.Reflection;
namespace CalculateDemo
{
class OperatorFactory
{
/// <summary>
/// 利用反射
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public static Operator Create(string name)
{
Operator opr = null;
Type cls = Type.GetType(name);
//GetConstructor(),返回ConstructorInfo类型,用于取得该类的构造函数的信息
ConstructorInfo ci = cls.GetConstructor(Type.EmptyTypes);
//调用具有指定参数的实例反映的构造函数,为不常用的参数提供默认值
opr = (Operator)ci.Invoke(null);
return opr;
}
}
}