Есть ли любой способ использовать дополнительный метод в объектном блоке инициализатора в C#

Я хотел бы сделать это как предложение для пользователя, чтобы пользователь мог подтвердить это для исправления. Если в слове содержится предложение об исправлении, отобразите маленькую кнопку рядом с этим словом, как только пользователь нажмет на него, отобразятся возможные варианты, когда пользователь нажмет на опцию и внесет исправление. Чтобы сделать это возможным, я думаю, что требуется специальный элемент управления для поля ввода, который преобразует отдельные слова в отдельные элементы html (span или div). Он может быть построен из html div и невидимого элемента ввода (он будет иметь обработчики фокуса и клавиатуры). Когда пользователь нажимает пробел, на сервере необходимо проверить новое слово, просто отправьте запрос AJAX с новым словом и отобразите предложения по исправлению, если таковые имеются.

7
задан dtlvd 20 April 2018 в 12:50
поделиться

6 ответов

Еще лучше:

public static T SetBarValue<T>(this T dataObject, int barValue)
        where T : BaseDataObject 
    {
        dataObject.SetData("bar", barValue);
        return dataObject;
    }

и можно использовать этот дополнительный метод для производных типов BaseDataObject к цепочечным методам без бросков и сохранить реальный тип при выведении в поле var или анонимный тип.

3
ответ дан 6 December 2019 в 19:44
поделиться

Нет, но Вы могли сделать это....:

BaseDataObject test2 = (new BaseDataObject { SomeValue = 3, SomeOtherValue = 4}).SetBarValue(5);

И имейте свой возврат расширения, который Делает объект как Linq.

Править: Это было хорошей мыслью, непока я не перечитал и видел, что базовый класс был разработан третьим лицом: иначе у Вас нет кода. Другие здесь отправили правильное решение.

4
ответ дан 6 December 2019 в 19:44
поделиться
 static T WithBarValue<T>(this T dataObject, int barValue)
        where T : BaseDataObject 
 {  dataObject.SetData("bar", barValue);    
    return dataObject;
 }

var x = new BaseDataObject{SomeValue=3, OtherValue=4}.WithBarValue(5);
1
ответ дан 6 December 2019 в 19:44
поделиться

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

var x = new BaseDataObject { SomeValue = 3, SomeOtherValue = 4 };

Получит компилятор к чему-то вроде этого:

BaseDataObject tempObject = new BaseDataObject();
tempObject.SomeValue = 3;
tempObject.SomeOtherValue = 4;
BaseDataObject x = tempObject;

Различие - то, что не может быть никаких проблем синхронизации. Переменная x добирается, присвоил полностью присвоенный BaseDataObject сразу, Вы не можете смешать с объектом во время, он - инициализация.

Вы могли просто назвать дополнительный метод после создания объекта:

var x = new BaseDataObject { SomeValue = 3, SomeOtherValue = 4 };
x.SetBarValue()

Вы могли измениться, SetBarValue, чтобы быть свойством с получают/устанавливают, который может быть присвоен во время инициализации:

public int BarValue
{
    set
    {
        //Value should be ignored
    }
}

Или, Вы могли разделить на подклассы / используют шаблон фасада для добавления метода на объект:

public class DataObjectWithBarValue : BaseDataObject
{
    public void BarValue
    {
        set
        {
            SetData("bar", value);
        }
        get
        {
            (int) GetData("bar");
        }
    }
}
5
ответ дан 6 December 2019 в 19:44
поделиться

Действительно ли расширение является классом возможность? Затем Вы могли легко добавить свойство, в котором Вы нуждаетесь.

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

0
ответ дан 6 December 2019 в 19:44
поделиться

Право, извлекая уроки из отвечающих сторон, короткого ответа на "Является там каким-либо способом использовать дополнительный метод в объектном блоке инициализатора в C#?" "Нет".

Способом, которым я в конечном счете решил проблему, с которой я столкнулся (подобный, но более сложный, что модельная проблема, которую я создал здесь) был гибридный подход, следующим образом:

Я создал подкласс, например.

public class SubClassedDataObject : BaseDataObject
{
    public int Bar
    {
        get { return (int)GetData("bar"); }
        set { SetData("bar", value); }
    }
}

Который хорошо работает в LINQ, сходстве с блока инициализации

    SubClassedDataObject testSub = new SubClassedDataObject
    { SomeValue = 3, SomeOtherValue = 4, Bar = 5 };

Но причина, что мне не нравился этот подход во-первых, состоит в том, что эти объекты помещаются в XML и возвращаются как BaseDataObject, и вспоминание было раздражением, ненужной копией данных, и пустит в действие две копии того же объекта.

В остальной части кода я проигнорировал подклассы и использовал дополнительные методы:

    public static void SetBar(this BaseDataObject dataObject, int barValue)
    {
        dataObject.SetData("bar", barValue);
    }
    public static int GetBar(this BaseDataObject dataObject)
    {
        return (int)dataObject.GetData("bar");
    }

И это работает приятно.

0
ответ дан 6 December 2019 в 19:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: