using E = System.Linq.Expressions.Expression;
...
void theAlgorithm<T>(T someVar, string field, string creationFunction) where T : BaseSomeType{
E.Lambda<Action>(
E.Assign(
E.Field(E.Constant(someVar), field),
E.Call(E.Constant(this), creationFunction, null)
)
).Compile()();
lock (something){
T someOtherVar = (T)something.Find(someVar.unrelatedMember);
if (someOtherVar != null){
E.Lambda<Action>(
E.Assign(
E.Field(E.Constant(someOtherVar), field),
E.Field(E.Constant(someVar), field)
)
).Compile()();
}
}
}
dXNpbmcgRSA9IFN5c3RlbS5MaW5xLkV4cHJlc3Npb25zLkV4cHJlc3Npb247Ci4uLgp2b2lkIHRoZUFsZ29yaXRobTxUPihUIHNvbWVWYXIsIHN0cmluZyBmaWVsZCwgc3RyaW5nIGNyZWF0aW9uRnVuY3Rpb24pIHdoZXJlIFQgOiBCYXNlU29tZVR5cGV7CiAgICBFLkxhbWJkYTxBY3Rpb24+KAogICAgICAgIEUuQXNzaWduKAogICAgICAgICAgICBFLkZpZWxkKEUuQ29uc3RhbnQoc29tZVZhciksIGZpZWxkKSwKICAgICAgICAgICAgRS5DYWxsKEUuQ29uc3RhbnQodGhpcyksIGNyZWF0aW9uRnVuY3Rpb24sIG51bGwpCgkpCiAgICApLkNvbXBpbGUoKSgpOwogICAKICAgIGxvY2sgKHNvbWV0aGluZyl7CiAgICAgICAgVCBzb21lT3RoZXJWYXIgPSAoVClzb21ldGhpbmcuRmluZChzb21lVmFyLnVucmVsYXRlZE1lbWJlcik7CiAKICAgICAgICBpZiAoc29tZU90aGVyVmFyICE9IG51bGwpewogICAgICAgICAgICBFLkxhbWJkYTxBY3Rpb24+KAogICAgICAgICAgICAgICAgRS5Bc3NpZ24oCiAgICAgICAgICAgICAgICAgICAgRS5GaWVsZChFLkNvbnN0YW50KHNvbWVPdGhlclZhciksIGZpZWxkKSwKICAgICAgICAgICAgICAgICAgICBFLkZpZWxkKEUuQ29uc3RhbnQoc29tZVZhciksIGZpZWxkKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApLkNvbXBpbGUoKSgpOwogICAgICAgIH0KICAgIH0KfQ==