c#property get,设置不同的类型

时间:2011-04-15 15:58:20

标签: c# get properties set accessor

我有这样的枚举和财产。

        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'

我该如何编写属性的set访问器?

更新

我希望get访问器返回字符串并设置访问器以获取参数类型Employee.Type。我了解到根据C#规范,不可能在属性中执行此操作。我必须编写单独的getter和setter方法。

4 个答案:

答案 0 :(得分:12)

请改用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中的属性只是方法。

答案 1 :(得分:4)

像这样:

EmployeeType = (Type)Enum.Parse(typeof(Type), value);

答案 2 :(得分:3)

我建议你不要使用单词类型,你需要解析枚举:

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

修改

首先,我不能重申不要使用单词Type作为枚举或字符串来返回属性。其次,使用带有开关的枚举可能会给你带来麻烦,但是默认可能会让你失望。

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

答案 3 :(得分:-1)

理想情况下,您仍然应该拥有一个可以设置/获取该属性可以附加到的私有成员。从那里,您可以制作另一种方法来获得“Human Readable / Formatted”版本。 e.g。

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 我实际上更喜欢@Yuriy's使用DescriptionAttribute。保持其类型结构,但在打印时使其清晰。