C #: возможно ли создать объект, который имеет значение своего «свойства по умолчанию» при ссылке?

#c#-4.0

#c #-4.0

Вопрос:

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

 public class myObject
{
    public string myObject {get; private set;}
    public myObject( string tempstring)
    {
        this.myObject = tempstring.ToUpper();
    }
}

var a = new myObject("somevalue");
Console.WriteLine( myObject ); // outputs the string "SOMEVALUE"
  

Вот еще одна попытка:

 public class myInt
{
    public int myInt {get; private set;}
    public myInt(string tempInt)
    {    this.myInt = Convert.ToInt32(tempInt);
    }
}

var a = new myInt("3");
var b = a   a;   // ends up being an int datatype value of 6
  

Я знаю, что всегда мог бы сделать var b = a.myInt a.myInt . Думаю, я мог бы создать статический класс со статической функцией, которая каждый раз преобразует параметр в результат, но это не поддерживало бы состояние.

Просто любопытно. Это сделало бы то, что я на самом деле пытаюсь сделать, намного менее сложным.

Ответ №1:

В первом случае, да. Переопределите метод toString.

 public class myObject
{
    public string myValue {get; private set;}
    public myObject( string tempstring)
    {
        this.myValue = tempstring.ToUpper();
    }

    public override string ToString()
    {
        return myValue;
    }
}
  

Во втором случае, вроде. Не следует пытаться перегружать операторы, чтобы предложить неожиданное поведение. Создайте метод для выполнения поведения, которое не имело бы смысла при чтении кода. То, что вы предлагаете (возвращающий int), определенно не ожидалось бы от меня, чтобы вернуть int (в основном из-за var, а не строго определенного типа). Использование оператора для возврата нового myInt объекта имело бы смысл. Использование оператора, возвращающего значение, int не будет.

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

Внутри класса вы могли бы использовать:

 public static implicit operator int(myInt m) 
{
    return myValue;
}

public static myInt operator  (myInt left, myInt right) 
{
    // requires constructor that takes int
    return new myInt(left.myValue   right.myValue);
}
  

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

 public static int operator  (myInt left, myInt right) 
{
    return left.myValue   right.myValue;
}
  

Комментарии:

1. public static implicit operator int( myInt m) Это то, что я ищу, за исключением того, что в моем реальном случае это было бы что-то вроде public static implicit operator Expression.Lambda<Func<Product, bool>>( myCondition m) где m — спецификация, записанная в виде строки (предложение where), и она неявно преобразует ее в лямбда-выражение. (все еще пытаюсь разобраться с этим.)

2. Можете ли вы показать желаемое использование (с помощью лямбда)? Очевидно, что это может быть грубо по краям, иначе вам не нужно было бы спрашивать, но попробуйте сначала выполнить это с явным приведением, и, надеюсь, мы сможем перейти к неявному.

3. Это будет грубо, но я попробую. Это может занять некоторое время.

4. linqspecs.codeplex.com очень похоже на то, что я пытаюсь сделать. Внизу они упоминают «AdHocSpecification — это альтернативный способ написания спецификации без написания класса. Вы не должны злоупотреблять ими и пытаться записать их в одном месте, как объяснено выше. Также AdHocSpecification не реализует Equals , поэтому две AdHocSpecifications равны, только если они являются одним и тем же экземпляром.»

Ответ №2:

Как насчет неявных преобразований. Смотрите http://msdn.microsoft.com/en-us/library/z5z9kes2 (VS.71).aspx

Комментарии:

1. 1 по ссылке с объяснением. Это именно то, что я ищу, что также есть в ответе pickypg.