为私有对象属性创建一个访问器方法 - 枚举?

时间:2012-03-02 01:56:19

标签: c# enumeration accessor

我正在学习访问器方法和枚举。我在命名空间'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#编码设计实践的书籍建议吗?

2 个答案:

答案 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);
    }
}

但这是一个非常糟糕的主意。