c # свойство get, устанавливается с разными типами - PullRequest
5 голосов
/ 15 апреля 2011

У меня есть такое перечисление и свойство.

        public enum Type
        {
            Hourly = 1,
            Salary = 2,
            None = 3
        };


        public string EmployeeType
        {
            get
            {
                string type;
                switch (employeeType)
                {
                    case Type.Hourly:
                        type = "Hourly Employee";
                        break;
                    case Type.Salary:
                        type = "Salary Employee";
                        break;
                    default:
                        type = "None";
                        break;
                }
                return type;
            }

            // **EDIT:**
            // Now I am trying to parse the string as enum Type.
            // But Constructor still waits a string to set EmployeeType.
            set
            {
                employeeType = (Type)Enum.Parse(typeof(Type), value);
            }
        }

Это мой класс:

public class Employee
{
     private Type employeeType;
}

И я хочу создать такой конструктор:

Employee(Employee.Type type) 
{
      EmployeeType = type;
}

РЕДАКТИРОВАТЬ:

Невозможно неявно преобразовать тип 'Payroll.Employee.Type' в 'string'

Как записать аксессор набора свойства?

ОБНОВЛЕНИЕ:

Я хотел, чтобы метод доступа get возвращал строку, и чтобы метод доступа принимал параметр типа Employee.Type.Я узнал, что это невозможно сделать в свойстве в соответствии со спецификацией C #.Я должен написать отдельные методы получения и установки.

Ответы [ 4 ]

12 голосов
/ 15 апреля 2011

Используйте взамен DescriptionAttribute .

public enum Type
{
    [Description("Hourly Employee")]
    Hourly = 1,
    [Description("Salary Employee")]
    Salary = 2,
    [Description("None")]
    None = 3
};

Тогда у вас просто будет

public Type EmployeeType {get; set;}

собственность. И если кто-то захочет написать это, он может получить описание. Я бы также назвал это Type вместо EmployeeType, потому что вызов myEmployee.EmployeeType звучит избыточно. Другой вариант может состоять в том, чтобы развернуть свойство и использовать два метода

public string GetEmployeeType() { //your switch statement }
public void SetEmployeeType(EmployeeType type)
{
    _type = type;
}

Не так элегантно, как собственность, но быстро делает свою работу. Также помните, что свойства в IL - это просто методы.

4 голосов
/ 15 апреля 2011

Как это:

EmployeeType = (Type)Enum.Parse(typeof(Type), value);
3 голосов
/ 15 апреля 2011

Я рекомендую не использовать тип слова, и вам нужно проанализировать перечисление:

set
{
    employeeType = (Type)Enum.Parse(typeof(Type), value);
}

Редактировать: Во-первых, я не могу повторить достаточно, чтобы не использовать слово Type для перечисления ИЛИ строки для возврата свойства.Во-вторых, использование перечислений здесь с switch может привести к неприятностям, но значение по умолчанию может выручить вас.

public enum WorkType
{
    Hourly = 1,
    Salary = 2,
    None = 3
};

// Initialize this to prevent craziness
private WorkType employeeType = WorkType.None;
public string EmployeeType
{
    get
    {
        // I'm not sure why you want to return a string
        // in this property but whatevs.
        // First make sure that you have a valid enum
        if ((int)employeeType > 3 || (int)employeeType < 1)
            employeeType = WorkType.None;
        return employeeType.ToString();   // Don't need a switch, just call ToString()
        }

        set
        {
            // This might be better served with a TryParse. This will
            // be more fault tolerant if someone using your class passes
            // in an invalid WorkType.
            if(!TryParse(typeof(WorkType), value, out employeeType))
                employeeType = WorkType.None;
        }
    }
}

Я подозреваю, что проблема, с которой вы сталкиваетесь при конвертации, заключается в том, что вы используетеприсваивание, которое не является строкой типа:

WorkType someType = WorkType.None;
this.EmployeeType = someType;   // Exception is here

Это недопустимый случай, потому что someType является типом, а EmployeeType (value) является строкой.Чтобы исправить это, вам нужно присвоить его с помощью:

this.EmployeeType = someType.ToString();

Все это сводится к довольно глупому, потому что это можно сделать с помощью чего-то простого:

public enum WorkType
{
    Hourly = 1,
    Salary = 2,
    None = 3
};

public WorkType EmployeeType { get; set; }
// Any time you want to access the value of EmployeeType as a string you would
// simply use the following line:
// EmployeeType.ToString();
0 голосов
/ 15 апреля 2011

В идеале у вас должен быть личный член, который вы можете установить / получить, к которому может присоединиться свойство. Оттуда вы можете сделать еще один метод, чтобы получить версию «Читаемый / Форматированный человеком». например,

public enum EmployeeType
{
  Hourly = 1,
  Salary = 2,
  None = 3
}

private EmployeeType _EmployeeType;

public EmployeeType EmployeeType
{
  get { return this._EmployeeType; }
  set { this._EmployeeType = value; }
}

Тогда у вас есть метод для возврата отформатированной версии

public String EmployeeType()
{
  switch (this._EmployeeType)
  {
    case EmployeeType.Hourly:
      return "Hourly Employee";
    case EmployeeType.Salary:
      return "Salary Employee";
    default:
      return "None";
  }
}

или вот как бы я это сделал. В противном случае перечисление не имеет смысла, и вам нужно просто поработать со строкой и проверить правильность ввода / вывода, чтобы попасть в предварительно выбранные допустимые значения.

РЕДАКТИРОВАТЬ Я рекомендую это только потому, что ввод строки и попытка выровнять его с именем перечисления (как предлагали другие) просто кажутся мне ошибочными. Особенно с переходом «Почасовой» на «Почасовой Сотрудник». (obj).EmployeeType = "Hourly Employee" не будет работать с использованием Enum.Parse, потому что нет правильного перечисления, соответствующего вводу.

EDITv2 Мне действительно нравится @ 1018 * использование Юрием DescriptionAttribute лучше. Держите его структурированным, но при печати сделайте его разборчивым.

...