我正在学习访问器方法和枚举。我在命名空间'Vehicles'下写了一个公共类'Car',并设置私有属性,如_manufacturer,_model,_year和_color。我想编写一个方法来访问属性,另一个方法来设置/更新它们。这是我的班级:
using System;
namespace Vehicles
{
public class Car
{
private string _manufacturer;
private string _model;
private string _year;
private string _color;
public void honkHorn()
{
// Add argument for a file name?
// Code here to play a WAV file?
MessageBox.Show("Honk!");
}
public string getCarInfo(string whichProperty)
{
switch (whichProperty)
{
case ("manufacturer"):
return _manufacturer;
case ("model"):
return _model;
case ("year"):
return _year;
case ("color"):
return _color;
default:
return null;
}
}
public void setCarInfo(string whichProperty, string newValue)
{
switch (whichProperty)
{
case ("manufacturer"):
_manufacturer = newValue;
break;
case ("model"):
_model = newValue;
break;
case ("year"):
_year = newValue;
break;
case ("color"):
_color = newValue;
break;
}
}
}
}
这是我的表格:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Vehicles;
namespace CS_Enumeration
{
public partial class Form1 : Form
{
public Car myCar = new Car();
public Form1()
{
InitializeComponent();
myCar.setCarInfo("manufacturer", "Ford");
labelManfValue.Text = myCar.getCarInfo("manufacturer");
myCar.setCarInfo("model", "Ranger");
labelModelValue.Text = myCar.getCarInfo("model");
myCar.setCarInfo("year", "2012");
labelYearValue.Text = myCar.getCarInfo("year");
myCar.setCarInfo("color", "Blue");
labelColorValue.Text = myCar.getCarInfo("color");
}
private void button1_Click(object sender, EventArgs e)
{
myCar.honkHorn();
}
}
}
这真的是编写可以获取/设置的单个方法的最佳方法吗?我首先尝试转换与对象属性的名称匹配的字符串值并返回实际属性,但这不起作用(除非有人知道如何将字符串转换为对象属性?)。
感谢您的回复。这是我正在阅读的一本书的练习。它甚至说不是所有东西都应该是公开的,但并非一切都应该是私人的。那么我怎么知道什么时候应该/不应该公开/私人?听起来这本书正在引导我走向错误的方向,关于什么是好的编码设计。任何人都有任何关于学习Visual C#编码设计实践的书籍建议吗?
答案 0 :(得分:1)
不要这样做。
使用公共属性,您可以获得类型安全性以及更加富有表现力的类。在您当前的方法中,属性名称字符串中的任何拼写错误都将导致运行时异常,而不是编译错误。
只需使用属性:
public class Car
{
public string Manufacturer {get; set;}
public string Model {get; set;}
public string Year {get; set;}
public string Color {get; set;}
//..
}
现在您可以直接访问这些属性:
myCar.Manufacturer = "Ford";
labelManfValue.Text = myCar.Manufacturer;
此外,您应该定义一个完全初始化Car对象的构造函数,否则您可能设置了一些属性,而其他属性则没有。
答案 1 :(得分:0)
你可以用反射来做到这一点:
void Main()
{
var foo = new Foo();
foo.Set("bar","test");
Console.WriteLine(foo.Get("bar"));
}
class Foo
{
string bar;
string bop;
public void Set(string name, string value)
{
GetType().GetField(name, BindingFlags.NonPublic|BindingFlags.Instance)
.SetValue(this, value);
}
public string Get(string name)
{
return (string)GetType().GetField(name, BindingFlags.NonPublic|BindingFlags.Instance)
.GetValue(this);
}
}
但这是一个非常糟糕的主意。