Информация об изменениях

Сообщение Re: Обнулить свойство от 28.04.2023 9:19

Изменено 28.04.2023 9:32 kov_serg

Re: Обнулить свойство
Здравствуйте, vaa, Вы писали:

vaa>SetNull принимает поля, но не св-ва или индексаторы.

vaa>Возможно ли что-то похожее для св-в чтобы сократить кол-во ифчиков?

vaa>
vaa>class A
vaa>{
vaa> public string Name {get;set;}
vaa>}
vaa>void SetNull(ref string v) => if (v == "") v = null;
vaa>SetNull(ref a.Name);
vaa>


using System;

class A {
    public string Name { get; set; }
}

class App {
    static void SetNull(ref string v) { if (v == "") v = null; }
    static void SetNull(Func<string> get, Action<string> set) { if (get() == "") set(null); }
    static void SetNull<T>(T t, string name, params object[] index) {
        var prop = typeof(T).GetProperty(name);
        SetNull(
            ()=> (string)prop.GetValue(t, index),
            v => prop.SetValue(t, v, index)
        );
    }
    static void Main(string[] args) {
        string Name = "";
        SetNull(ref Name);

        var a = new A() { Name = "" };

        SetNull(() => a.Name, v => a.Name = v);
        SetNull(a,"Name");
    }
}
Re: Обнулить свойство
Здравствуйте, vaa, Вы писали:

vaa>SetNull принимает поля, но не св-ва или индексаторы.

vaa>Возможно ли что-то похожее для св-в чтобы сократить кол-во ифчиков?

vaa>
vaa>class A
vaa>{
vaa> public string Name {get;set;}
vaa>}
vaa>void SetNull(ref string v) => if (v == "") v = null;
vaa>SetNull(ref a.Name);
vaa>


using System;

class A {
    public string Name { get; set; }
}

public class Ref<T> {
    public Func<T> get { get; private set; }
    public Action<T> set { get; private set; }
    Ref(Func<T> get, Action<T> set) { this.get = get; this.set = set; }
    public static Ref<T> propery<Y>(Y y, string name, params object[] index) {
        var p = typeof(Y).GetProperty(name);
        return new Ref<T>( () => (T)p.GetValue(y, index), v => p.SetValue(y, v, index) );
    }
}

class App {
    static void SetNull(ref string v) { if (v == "") v = null; }
    static void SetNull(Ref<string> v) { if (v.get() == "") v.set(null); }

    static void Main(string[] args) {
        string Name = "";
        var a = new A() { Name = "" };

        SetNull(ref Name);
        SetNull(Ref<string>.propery(a, "Name"));
    }
}