Я хотел бы сделать это как предложение для пользователя, чтобы пользователь мог подтвердить это для исправления. Если в слове содержится предложение об исправлении, отобразите маленькую кнопку рядом с этим словом, как только пользователь нажмет на него, отобразятся возможные варианты, когда пользователь нажмет на опцию и внесет исправление. Чтобы сделать это возможным, я думаю, что требуется специальный элемент управления для поля ввода, который преобразует отдельные слова в отдельные элементы html (span или div). Он может быть построен из html div и невидимого элемента ввода (он будет иметь обработчики фокуса и клавиатуры). Когда пользователь нажимает пробел, на сервере необходимо проверить новое слово, просто отправьте запрос AJAX с новым словом и отобразите предложения по исправлению, если таковые имеются.
Еще лучше:
public static T SetBarValue<T>(this T dataObject, int barValue)
where T : BaseDataObject
{
dataObject.SetData("bar", barValue);
return dataObject;
}
и можно использовать этот дополнительный метод для производных типов BaseDataObject к цепочечным методам без бросков и сохранить реальный тип при выведении в поле var или анонимный тип.
Нет, но Вы могли сделать это....:
BaseDataObject test2 = (new BaseDataObject { SomeValue = 3, SomeOtherValue = 4}).SetBarValue(5);
И имейте свой возврат расширения, который Делает объект как Linq.
Править: Это было хорошей мыслью, непока я не перечитал и видел, что базовый класс был разработан третьим лицом: иначе у Вас нет кода. Другие здесь отправили правильное решение.
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);
Объектные Инициализаторы являются просто синтаксическим сахаром, который требует умного компилятора, и с текущей реализации Вы не можете назвать методы в инициализаторе.
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");
}
}
}
Действительно ли расширение является классом возможность? Затем Вы могли легко добавить свойство, в котором Вы нуждаетесь.
Приводя это к сбою, можно создать новый класс, который имеет подобные свойства, которые просто перезванивают к частному экземпляру класса, которым Вы интересуетесь.
Право, извлекая уроки из отвечающих сторон, короткого ответа на "Является там каким-либо способом использовать дополнительный метод в объектном блоке инициализатора в 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");
}
И это работает приятно.