Создание метода доступа для свойств частного объекта - перечисление? - PullRequest
1 голос
/ 02 марта 2012

Я изучаю методы доступа и перечисление. Я написал общедоступный класс «Автомобиль» под пространством имен «Транспортные средства» и установил частные свойства, такие как _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 ]

1 голос
/ 02 марта 2012

Не делайте этого.

Вместо этого используйте публичные свойства, и вы получите безопасность типов и гораздо более выразительное использование вашего класса.В вашем текущем подходе любая опечатка в строке имени свойства вызовет исключение времени выполнения вместо ошибки компиляции.

Просто используйте свойства:

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, иначе у вас могут быть установлены некоторые свойства, а другие нет.

0 голосов
/ 02 марта 2012

Вы можете сделать это с помощью отражения:

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

Но это довольно плохая идея.

...