在Java中,我可以有一个这样的对象:
public class MyObject {
private Date date;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public void setDate(String date) {
this.date = parseDateString(date);
}
private Date parseDateString(String date) {
// do magic here
return dateObj;
}
}
这很好,因为我有一个吸气剂用于我的属性和多个二传手。我可以设置" date"通过传入Date对象或String来传递属性,并让类弄清楚。
在C#中看起来情况有点不同。我可以这样做:
public class MyObject
{
public DateTime Date { get; set; }
}
这里的速记显然是最佳的。但是,我不确定是否有任何内置方法可以重置setter以接受多种类型。我意识到我可以创建一个单独的公共方法来设置值,但这会牺牲使用对象初始化器的能力。
有没有办法直接重载C#公共属性的setter?或者这只是语言限制,而且无法完成?
答案 0 :(得分:22)
所有其他答案都是正确的...但如果你坚持,你可以通过以下几种方式做到:
仅使用setter使用第二个属性:
public string DateText { set { Date = ParseDateString(value); } }
尽可能避免这种情况,只会增加混乱: - )
使用方法而不是属性(与在Java中相同)。方法可以重载。这应该是最推荐的方式。
使用自定义类(而非DateTime
)并在DateTime
,string
和您的班级之间提供隐式转换。除非你打算在其他地方使用它,否则不推荐使用。
将属性更改为object
并在设置器中提供您的转换:请不要这样做
答案 1 :(得分:16)
嗯,你把苹果与香蕉比较。你在Java中有什么:
public void setDate(Date date) {
this.date = date;
}
public void setDate(String date) {
this.date = parseDateString(date);
}
在C#中看起来像这样:
public void SetDate(Date date)
{
this.date = date;
}
public void SetDate(String date)
{
this.date = ParseDateString(date);
}
唯一的区别是PascalCase
成员名称和范围大括号的位置。
您的Java代码重载方法;上面的C#有重载方法。
AFAIK你不能重载属性设置器,因为:
public DateTime Date
{
get { return this.date; }
set { this.date = value; }
}
... value
的类型取决于成员的类型,此处为DateTime
。
因此,如果您想要方法重载,请重载方法,而不是属性。请记住,C#属性只是getter和amp;的语法糖。无论如何,setter方法。
答案 2 :(得分:10)
自动属性不支持此功能。所以你必须像在Java中那样做。
当然你也可以混合这些:提供一个自动属性和额外的set方法来使用不同的类型设置属性。
public class MyObject
{
public DateTime Date { get; set; }
public void SetDate(string date)
{
this.Date = DateTime.Parse(date);
}
}
答案 3 :(得分:10)
我会写一个不同的答案并声称
public void setDate(Date date) {
this.date = date;
}
public void setDate(String date) {
this.date = parseDateString(date);
}
开始时是不好的做法。
通过执行上述操作,您声称字符串和日期都是Date
的有效值。事实并非如此 - 您真正想要的是Date
。如果用户有一个字符串并希望它转换为Date
,那么他们应该依赖于Date
API (Java中的DateFormat.parse()
DateTime.Parse()
中的字符串解析功能。在C#)中,而不是你的API。
如果Date
是您定义的类,并且您确实希望Date
和string
可以互换,那么您应该在Date
中使用implicit conversations } class,而不是要求Date
类的用户写入重载。