簡體   English   中英

C# 屬性。 多 SET 輸入類型

[英]C# Properties. Multiple SET input type

我有一個看起來像這樣的屬性

private int clientID;

    public int ClientID
    {
        get { return clientID; }
        set { clientID = value; }
    }

我希望能夠將一個字符串傳遞給這個屬性,以便設置器為我轉換它。 我怎么做?

我知道如何進行轉換,我只需要知道如何傳入一個字符串而不會引發類型錯誤。

謝謝,

湯姆

你不能,基本上。 選項:

  • 將 ClientID 的第二個屬性作為文本(由同一字段支持)
  • 有一個單獨的方法(例如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);
    }
}

你不能重載屬性,所以這不起作用。

你能做的是

  1. 只需在設置之前將其轉換為 int (首選)
  2. 創建一個從客戶端進行轉換的方法,即SetClientIdFromString(strign id )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM