Вам нужно будет ввести variable
член как Func<MyValueType>
(или другой delegate
, который возвращает MyValueType
), но вы не сможете назначить значение blah
таким образом. Как и при использовании замыкания в цикле foreach
выше, будет оцениваться только в момент времени . Это не способ синхронизировать значение вашей переменной с другим объектом. На самом деле нет способа сделать это без:
- непрерывный мониторинг значения свойства другого экземпляра в каком-то цикле, например
Timer
- реализация события уведомления об изменении в классе другого экземпляра
Вы сможете реализовать такое свойство (поскольку свойство оценивается при каждом вызове), но тогда какой смысл использовать пользовательский делегат, кроме того факта, что вам не нужно ничего знать о другой экземпляр.
Редактировать
Я постараюсь сделать это немного яснее. Используя этот код, который вы разместили:
Class MyClass
{
...
Action<MyValueType> variable;
...
MyValueType blah = variable();
//use it
...
}
...
MyClass myClass = new MyClass();
myClass.variable = () => myOtherObject.MyOtherProperty;
Во-первых, для того, чтобы это было функционально, variable
должно быть Func<MyValueType>
, а не Action<MyValueType>
(Func
возвращает значение, Action
- нет; поскольку вы пытаетесь присвоить значение переменной , вам нужно выражение для возврата значения).
Во-вторых, главная проблема в вашем подходе - если я правильно читаю ваш код - вы пытаетесь присвоить значение переменной экземпляра blah
оценочному значению variable()
в классе декларация. Это не сработает по нескольким причинам:
- присваивания внутри объявлений классов не могут получить доступ к членам экземпляра (который
variable
есть)
- присваивание переменной в объявлении класса происходит только при создании объекта. Даже если бы присутствовало первое условие, вы просто получили бы
NullReferenceException
при создании экземпляра вашего объекта, поскольку он попытался бы оценить variable
, что в то время было бы null
- , даже если не учитывать первые два, значение
blah
все равно будет представлять только оценочное значение variable()
в любое время, когда оно было оценено. Он не будет «указывать» на эту функцию и будет автоматически синхронизирован, как кажется, вы пытаетесь это сделать.
Если вам не нужна какая-то автоматическая синхронизация, то ничто не мешает вам просто оставить делегата Func<MyValueType>
для оценки; в этом подходе нет ничего особенно хорошего или плохого, и он не будет закрытием, если только делегат (в вашем случае лямбда-выражение) не использует локальную переменную.