[英]C# Properties. Multiple SET input type
我有一個看起來像這樣的屬性
private int clientID;
public int ClientID
{
get { return clientID; }
set { clientID = value; }
}
我希望能夠將一個字符串傳遞給這個屬性,以便設置器為我轉換它。 我怎么做?
我知道如何進行轉換,我只需要知道如何傳入一個字符串而不會引發類型錯誤。
謝謝,
湯姆
你不能,基本上。 選項:
SetClientID(string)
)object
並根據傳入的值做不同的事情(呃 - 請不要這樣做!)你不能。 您可以創建這樣的方法
public void SetClientId(string clientId)
{
this.ClientID = Convert.ToInt32(clientId);
}
我建議你不要嘗試。 你只會讓以后的日子頭疼。
添加一個額外的設置器,而不是......
public string ClientIDText
{
set
{
clientID = int.Parse(value);
}
}
或創建一個 SetClientID(string) 方法。
創建 SetClientID 方法有一個好處; 你可以創建重載,所以你可以創建
SetClientID(int)
SetClientID(string)
etc.
但是,我仍然認為您在應用程序中構建歧義是為了方便保存幾行代碼。
或者,您可以提供一個 ClientID class 在自身、int 和 string 之間進行隱式轉換,然后您可以擁有一個屬性:
public ClientIdType ClientId
{
get; set;
}
但是所有的調用者都可以這樣使用它:
var myClass = new MyClass();
myClass.ClientId = 1;
myClass.ClientId = "2";
int id = myClass.ClientId;
http://msdn.microsoft.com/en-us/library/85w54y0a.aspx
然而,這似乎是為了讓調用者更容易做的大量工作,但它仍然是一種選擇。
您不能將字符串傳遞給聲明為 integer 的屬性。 您可以改用一種方法。
我認為最干凈的解決方案是,正如其他人所建議的那樣,創建一個 ClientId class。 我認為這不一定是壞事,因為這篇文章很好地解釋了:
許多類傾向於使用或公開原始值,如整數和字符串。 盡管此類原始類型存在於任何平台上,但它們往往會導致過程代碼。 此外,它們經常通過允許分配無效值來破壞封裝。
如果需要,擁有單獨的 class 還可以為您提供不同類型的驗證 id 的可能性。 最后,這一切都與封裝有關。
這樣的事情應該讓你開始:
//auto-property for your class
public ClientId ClientID
{
get; set;
}
和 ClientId class:
public class ClientId
{
private int _id;
public ClientId(int id) { _id = id; }
public ClientId(string id) { //convert id to int, throw exception if invalid }
public int Value { return _id; }
}
不要忘記也實現 Equals 和 GetHashCode,對於這個 class 可以輕松完成。
作為物業的替代品怎么樣:
private int rowValue_;
public object RowValue
{
get
{
return this.rowValue_;
}
set
{
var type = value.GetType();
if (type == typeof(string))
{
this.rowValue_ = Convert.ToInt32(value);
}
else if (type == typeof(int))
{
this.rowValue_ = (int)value;
}
else
{
throw new InvalidDataException(
"HandwritingData RowValue can only be string or int.
Passed in parameter is typeof {0}",
value.GetType().ToString());
}
}
}
它對我有用,也可以捕獲錯誤的參數。
問候,克里斯
在此示例中,如何繼承字符串 class? 如果您可以忍受擁有一個不是純字符串的屬性, René有一個很好的貢獻 - 但可以作為一個屬性並能夠轉換:
class Foo {
readonly string _value;
public Foo(string value) {
this._value = value;
}
public static implicit operator string(Foo d) {
return d.ToString();
}
public static implicit operator Foo(string d) {
return new Foo(d);
}
}
你不能重載屬性,所以這不起作用。
你能做的是
SetClientIdFromString(strign id )
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.