之前自己用C#做过计算器,但是没有用到封装和反射,这次修改了下,做个记录
配置文件App.config(动态添加运算符)
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/>
</startup>
<appSettings>
<add key="+" value="Addition"/>
<add key="-" value="subtract"/>
</appSettings>
</configuration>
Factory类
interface Factory
{
double operation(double num1, double nunm2);
}
subtract类
class subtract : Factory
{
public double operation(double num1, double num2)
{
double result = 0;
result = num1 - num2;
return result;
}
}
Addition类
class Addition : Factory
{
public double operation(double num1, double num2)
{
double result = 0;
result = num1 + num2;
return result;
}
}
Form
public partial class Form1 : Form
{
double num1, num2;
bool judge = false;//判断是不是小数
public Form1()
{
InitializeComponent();
string[] keys = ConfigurationSettings.AppSettings.AllKeys;
for (int i = 0; i < keys.Length; i++)
{
string key = keys[i];
comboBox1.Items.Add(key);
}
}
#region "="事件
private void button15_Click(object sender, EventArgs e)
{
num2 = double.Parse(textBox1.Text);
string notation = comboBox1.Text;//获得运算符
string sumbol = ConfigurationSettings.AppSettings[notation];//读配置文件符号
Factory factory = (Factory)Assembly.Load("计算器封装反射学习comboBox").CreateInstance("计算器封装反射学习comboBox." + sumbol);//反射获得计算类
double result = factory.operation(num1, num2);//通过operation方法进行计算
textBox1.Text = System.Convert.ToString(result);//显示结果
}
#endregion
#region 点击数字按钮,调用ClickNumber方法
public void ClickNumber(int Number)
{
if (judge)
{
textBox1.Text = textBox1.Text + Number;
}
else
{
if (textBox1.Text == "0")
{
textBox1.Text = Number + ".";
}
else
{
textBox1.Text = textBox1.Text.Substring(0, textBox1.Text.Length - 1) + Number + ".";
}
}
}
#endregion
#region 定义按钮0-9单击事件
private void button1_Click(object sender, EventArgs e)
{
ClickNumber(1);
}
private void button2_Click(object sender, EventArgs e)
{
ClickNumber(2);
}
private void button3_Click(object sender, EventArgs e)
{
ClickNumber(3);
}
private void button4_Click(object sender, EventArgs e)
{
ClickNumber(4);
}
private void button5_Click(object sender, EventArgs e)
{
ClickNumber(5);
}
private void button6_Click(object sender, EventArgs e)
{
ClickNumber(6);
}
private void button7_Click(object sender, EventArgs e)
{
ClickNumber(7);
}
private void button8_Click(object sender, EventArgs e)
{
ClickNumber(8);
}
private void button9_Click(object sender, EventArgs e)
{
ClickNumber(9);
}
private void button10_Click(object sender, EventArgs e)
{
ClickNumber(0);
}
#endregion
#region 判断小数点
private void button11_Click(object sender, EventArgs e)
{
judge = true;
}
#endregion
#region C键复位
private void button12_Click(object sender, EventArgs e)
{
num1 = 0;
num2 = 0;
judge = false;
textBox1.Text = "0";
label1.Text = "";
//comboBox1.Items.Clear();
}
#endregion
#region 退出所有程序
private void button16_Click(object sender, EventArgs e)
{
System.Environment.Exit(0);
}
#endregion
#region 主界面显示,计算器初始显示为"0"
private void Form1_Load(object sender, EventArgs e)
{
textBox1.Text = "0";
textBox1.TextAlign = HorizontalAlignment.Right;//右对齐
}
#endregion
#region
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
num1 = double.Parse(textBox1.Text);
textBox1.Text = "0";
judge = false;
}
#endregion
}
运行界面