Присвоить свойство, если не null, ничего не делать [дублировать]

Учитывая, что никто не упомянул об этом ...

Некоторые языки высокого уровня, такие как Python и Java, поставляются с инструментами для преодоления ограничений двоичной с плавающей запятой. Например:

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

22
задан diiN__________ 9 March 2016 в 10:32
поделиться

5 ответов

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

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

Комментарий Иоахима Исакссона по вашему вопросу показывает другой подход, который должен работать.

9
ответ дан Adimeus 28 August 2018 в 14:59
поделиться

Общий метод расширения SetValue (но только для свойств ref) будет:

    public static void SetValue<T>(this T property, T value)
    {
        property = value;
    }

И будет использоваться как

ButtonOrNull?.Visibility.SetValue(Visibility.Hidden);
0
ответ дан copa017 28 August 2018 в 14:59
поделиться

Как предложил Йохахим Исакссон в комментариях, теперь у меня есть метод SetData(Data data) и используйте его следующим образом:

MyPage1?.SetData(this.data);
MyPage2?.SetData(this.data);
MyPage3?.SetData(this.data);
5
ответ дан diiN__________ 28 August 2018 в 14:59
поделиться

Я придумал следующее расширение:

public static class ObjectExtensions
{
    public static void SetValue<TValue>(this object @object, string propertyName, TValue value)
    {
        var property = @object.GetType().GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance);
        if (property?.CanWrite == true)
            property.SetValue(@object, value, null);
    }
}

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

myObject?.SetValue("MyProperty", new SomeObject());

Следующая улучшенная версия работает на что угодно,

public static void SetValue<TObject>(this TObject @object, Action<TObject> assignment)
{
    assignment(@object);
}

И также может быть вызвана глобально,

myObject?.SetValue(i => i.MyProperty = new SomeObject());

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

1
ответ дан James M 28 August 2018 в 14:59
поделиться

Попробуйте добавить все ваши страницы в myPageList.

IEnumerable<MyPage> myPageList;

foreach(MyPage myPage in myPageList)
{
if (myPage != null)
    myPage.Data = this.data;
}
1
ответ дан Nithila Shanmugananthan 28 August 2018 в 14:59
поделиться
Другие вопросы по тегам:

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