我有这样的枚举和财产。
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方法。
答案 0 :(得分:12)
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
。保持其类型结构,但在打印时使其清晰。