Я продолжаю удивляться тому, что C # может делать с новыми функциями C # 3.0. Я собирался выбросить что-то там, что я думал, будет так себе, но оказывается, что лучше, чем я надеялся. Вот это.
Сделайте объект для хранения всех значений (давайте просто назовем его «держателем значения» ... не путать с любым другим использованием этого термина). Он не имеет ничего, кроме автоматических свойств C #. Затем создайте другой объект, который дает доступ владельцу стоимости. Назовите второй объект «SynchronicityHandler» (отнюдь не полный термин, но он поможет понять концепцию).
Пусть SynchronicityHandler выполняет блокировку. Теперь это может быть общим. Итак, вот что вы получите:
public class PersonValueHolder
{
public string FirstName { get; set; }
public string LastName { get; set; }
public bool HasCollegeDegree { get; set; }
}
public class SyncronicityHandler<T>
{
private object locker = new object();
private T valueHolder;
public SynchronicityHandler(T theValueHolder)
{
this.valueHolder = theValueHolder;
}
public void WorkWithValueHolderSafely(Action<T> yourAction)
{
lock(locker)
{
yourAction(valueHolder);
}
}
}
Вот пример того, как бы вы назвали это:
var myPerson = new SynchronicityHandler(new PersonValueHolder());
// Safely setting values
myPerson.WorkWithValueHolderSafely( p =>
{
p.FirstName = "Douglas";
p.LastName = "Adams";
p.HasCollegeDegree = true;
});
// Safely getting values (this syntax could be improved with a little effort)
string theFirstName = null;
myPerson.WorkWithValueHolderSafely( p=> theFirstName = p.FirstName);
Console.Writeline("Name is: " + theFirstName); // Outputs "Name is: Douglass".
Действительно, теперь, когда я думаю об этом, «держатель стоимости» не должен быть просто автоматическими свойствами. Это может быть любой объект.