C # Свойства.Тип входа множественного SET - PullRequest
2 голосов
/ 20 июля 2011

У меня есть свойство, которое выглядит следующим образом

private int clientID;

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

Я хотел бы иметь возможность передать строку в это свойство, чтобы установщик преобразовал его для меня.Как мне это сделать?

Я знаю, как сделать преобразование, мне просто нужно знать, как передать строку, не вызывая ошибки типа.

Спасибо,

Tom

Ответы [ 9 ]

8 голосов
/ 20 июля 2011

Вы не можете, в основном.Опции:

  • Иметь второе свойство для ClientID в виде текста (подкреплено тем же полем)
  • Иметь отдельный метод (например, SetClientID(string))
  • Изменитьтип свойства object и делать разные вещи в зависимости от значения, переданного в (urgh - не делайте этого!)
3 голосов
/ 20 июля 2011

Вы не можете. Вы можете создать такой метод, хотя

public void SetClientId(string clientId)
{
    this.ClientID = Convert.ToInt32(clientId);
}
2 голосов
/ 20 июля 2011

В качестве альтернативы, вы можете предоставить класс ClientID, который имеет неявное преобразование между собой, int и строкой, тогда у вас может быть свойство:

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

Тем не менее, это кажется большой работой, чтобы облегчить звонящим, но это все еще вариант.

2 голосов
/ 20 июля 2011

Я рекомендую вам не пытаться.Вы вызываете головную боль только на более поздний срок.

Вместо этого добавьте дополнительный установщик ...

public string ClientIDText
{
    set
    {
        clientID = int.Parse(value);
    }
}

или создайте метод SetClientID (string).

Есть преимущество в создании метода SetClientID;вы можете создавать перегрузки, чтобы вы могли создавать

SetClientID(int)
SetClientID(string)
etc.

Однако я все еще думаю, что вы вносите двусмысленность в свое приложение для удобства сохранения нескольких строк кода.

1 голос
/ 20 июля 2011

Я думаю, что самое чистое решение, как предлагали другие, - создать класс ClientId. Я не думаю, что это обязательно плохо, как этот пост объясняет довольно хорошо:

Многие классы имеют тенденцию потреблять или выставлять примитивные значения как целые числа и строки. Хотя такие примитивные типы существуют на любом платформы, они имеют тенденцию приводить к процессуальному коду Кроме того, они часто нарушить инкапсуляцию, разрешив присваивать недопустимые значения.

Наличие отдельного класса дает вам различные возможности для проверки идентификатора, если это требуется. В конце концов, все дело в инкапсуляции.

Что-то вроде этого должно начать вас:

//auto-property for your class
public ClientId ClientID
{
   get; set;
}

И класс ClientId:

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, что можно сделать тривиально для этого класса.

1 голос
/ 20 июля 2011

Вы не можете передать строку свойству, которое объявлено как целое число.Вместо этого вы можете использовать метод.

0 голосов
/ 30 сентября 2016

В этом примере Как я могу наследовать строковый класс? есть хороший вклад 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);
    }
}
0 голосов
/ 14 ноября 2012

Как насчет альтернативы в собственности:

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

Это работает для меня так же, как и отслеживание неверных параметров.

С уважением, Chris

0 голосов
/ 20 июля 2011

Вы не можете перегрузить свойства, так что это не будет работать.

Что вы можете сделать, это

  1. Просто конвертируйте вещь в int перед установкой (предпочтительно)
  2. Создайте метод для преобразования клиентов: SetClientIdFromString(strign id ).
...