using System;
public class Test
{
class Foo {
public string ValueA { get; set; }
public int ValueB { get; set; }
}
static Func<Func<Foo,T>,T> ValueOrDefault<T>(Foo orig, Foo toReplace, Predicate<T> replaceIf) {
return getValue => {
var origValue = getValue(orig);
var replaceWith = getValue(toReplace);
return replaceIf(origValue) ? replaceWith : origValue;
};
}
public static void Main()
{
Foo fromDb = new Foo();
Foo toSave = new Foo();
Predicate<string> isNullEmpty = string.IsNullOrEmpty;
var valueA = ValueOrDefault(toSave, fromDb, isNullEmpty)(f => f.ValueA);
Predicate<int> isZero = i => i == 0;
var valueB = ValueOrDefault(toSave, fromDb, isZero)(f => f.ValueB);
}
}
dXNpbmcgU3lzdGVtOwoKcHVibGljIGNsYXNzIFRlc3QKewoJCmNsYXNzIEZvbyB7CiAgcHVibGljIHN0cmluZyBWYWx1ZUEgeyBnZXQ7IHNldDsgfQogIHB1YmxpYyBpbnQgVmFsdWVCIHsgZ2V0OyBzZXQ7IH0KfQoKICBzdGF0aWMgRnVuYzxGdW5jPEZvbyxUPixUPiBWYWx1ZU9yRGVmYXVsdDxUPihGb28gb3JpZywgRm9vIHRvUmVwbGFjZSwgUHJlZGljYXRlPFQ+IHJlcGxhY2VJZikgewogICAgcmV0dXJuIGdldFZhbHVlID0+IHsKICAgICAgdmFyIG9yaWdWYWx1ZSA9IGdldFZhbHVlKG9yaWcpOwogICAgICB2YXIgcmVwbGFjZVdpdGggPSBnZXRWYWx1ZSh0b1JlcGxhY2UpOwogICAgICByZXR1cm4gcmVwbGFjZUlmKG9yaWdWYWx1ZSkgPyByZXBsYWNlV2l0aCA6IG9yaWdWYWx1ZTsKICAgIH07CiAgfQoJCglwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCgl7CgoKICAgIEZvbyBmcm9tRGIgPSBuZXcgRm9vKCk7CiAgICBGb28gdG9TYXZlID0gbmV3IEZvbygpOwogICAgUHJlZGljYXRlPHN0cmluZz4gaXNOdWxsRW1wdHkgPSBzdHJpbmcuSXNOdWxsT3JFbXB0eTsKICAgIHZhciB2YWx1ZUEgPSBWYWx1ZU9yRGVmYXVsdCh0b1NhdmUsIGZyb21EYiwgaXNOdWxsRW1wdHkpKGYgPT4gZi5WYWx1ZUEpOwogICAgUHJlZGljYXRlPGludD4gaXNaZXJvID0gaSA9PiBpID09IDA7CiAgICB2YXIgdmFsdWVCID0gVmFsdWVPckRlZmF1bHQodG9TYXZlLCBmcm9tRGIsIGlzWmVybykoZiA9PiBmLlZhbHVlQik7CgoKCX0KfQ==