Создайте свойство, которое принимает тип, отличный от возвращаемого - PullRequest
2 голосов
/ 03 мая 2011

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

Ответы [ 7 ]

9 голосов
/ 03 мая 2011

Вы не должны использовать свойства таким образом.Свойства используются для переноса вызовов get_ и set_ в соответствующее вспомогательное поле и представления их как одного члена.Метод set_, который генерируется внутренне, - это void, и он принимает экземпляр типа свойства в качестве единственного аргумента.

Если то, что вы пытаетесь достичь, требует метода, то предоставьте метод.Единственное решение, которое вы могли бы использовать иначе, это использовать object.

3 голосов
/ 03 мая 2011

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

Единственное решение, которое я могу придумать, и, к тому же, плохое , это объявить свойство типа object.

Как лучше всего инкапсулировать этот метод и выставлять его с помощью свойства?

Должно ли это быть одно и то же свойство? Не могли бы вы иметь что-то похожее на:

private Type2 _valueThatIsStoredAsAResultOfCallMethod;

private Type2 CallMethod(Type1 value)
{
    // Whatever logic is required here to take a value of Type1 and
    // get a value of Type2 from it
    return value.ToType2();
}

public Type1
{
    set
    {
        // value is of type Type1
        _valueThatIsStoredAsAResultOfCallMethod = CallMethod(value);
    }
}

public Type2
{
    get
    {
        return _valueThatIsStoredAsAResultOfCallMethod;
    }
}
1 голос
/ 27 августа 2014
public bool MyProp
{
    get;
    private set;
}


public int MyProp_AsInt
{
    set
    {
        MyProp = (value > 0) ? true : false;
    }
}

Тело вашей функции может заменить вышеуказанный «набор».Я просто поместил туда пример кода.

Убедитесь, что вы присваиваете значение возврата вашей функции MyProp.

полный код

public class MyClass
{

    public bool MyProp
    {
        get;
        private set;
    }


    public int MyProp_AsInt
    {
        set
        {
            MyProp = (value > 0) ? true : false;
        }
    }

}

public class Program
{

    static void Main(string[] args)
    {
        MyClass o = new MyClass();
        o.MyProp_AsInt = 1;
        System.Console.WriteLine("{0}", o.MyProp);
        o.MyProp_AsInt = 0;
        System.Console.WriteLine("{0}", o.MyProp);

        string line = System.Console.ReadLine();
    }
}
1 голос
/ 03 мая 2011

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

Я бы просто раскрыл метод.

0 голосов
/ 03 мая 2011

Метод, который принимает параметр и возвращает значение, плохо переводится в свойство независимо от используемых им типов.

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

0 голосов
/ 03 мая 2011

Методы используются для возврата различных типов и принятия входных данных.

Свойства не являются. Они возвращают один тип и не принимают ввод. Одна из главных вещей, которые разделяют их.

0 голосов
/ 03 мая 2011

Нет лучшей практики для этого, потому что это плохая практика.

Если бы у вас было два ковариантных типа в качестве принятия / возврата, вы могли бы обращаться к ним по их наименьшему общему предку, но я бывсе еще будь осторожен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...