查到的都是屬性中使用get觸發事件,但是這種方式在遇到只讀外部類時候不是很實用。
現在參考里有一個Isenabled屬性,我想在他變成false時候 ui上亮紅燈,true亮綠燈,應該怎么解決呢?
uj5u.com熱心網友回復:
搞了一晚上,希望高手賜教
uj5u.com熱心網友回復:
這個不行,要么用屬性,要么用委托/介面uj5u.com熱心網友回復:
我在回答技術問題的時候很少打比喻,不過這個問題比較簡單,也很適合打比喻,就例外吧。如果一個人他改變了自己的狀態,比如說他不舒服,不開心,他也不告訴你的話,你會怎么辦呢?也就只有一個辦法了,就是經常去檢查一下他,你在對待這個變數的時候,也就只有這種方法了。
uj5u.com熱心網友回復:
太陽底下無新鮮事,你要的是mvvm(net本身也支持mvvm,只是需要對方實作InotifyPropertychanged)來看下面
https://github.com/DMQ/mvvm
當然js是解釋性,可以動態覆寫。我也不想廢腦漿,搞啥劫持,你先用最簡單最low的interval定時器實作(畢竟net是半編譯的,想運行期劫持比js大,這種東西你有能力搞在說)
uj5u.com熱心網友回復:
不廢腦漿的寫法,100ms檢查一次。using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Reactive.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using WindowsFormsApp1.Annotations;
namespace WindowsFormsApp1
{
public partial class Form3 : Form
{
public Form3()
{
InitializeComponent();
}
private void Form3_Load(object sender, EventArgs e)
{
;
var t = new test();
NotifyPro(t, p => p.A)
.ObserveOn(SynchronizationContext.Current)
.Subscribe(p => { this.label1.Text = p; });
}
private IObservable<T> NotifyPro<T1,T>(T1 obj, Func<T1, T> func)
{
return Observable.Interval(TimeSpan.FromMilliseconds(100))
.Select(p => func(obj))
.DistinctUntilChanged();
}
}
public class test
{
public test()
{
Task.Run(async () =>
{
while (true)
{
this.A = DateTime.Now.ToString();
await Task.Delay(1000);
}
});
}
public string A { get; set; }
}
}
emit可以不過前提是對方virtual,這樣可以動態覆寫,這也是很多動態代理和aop攔截為啥要求你寫成virtual和介面的原因,介面也顯示覆寫掉
runtime IL劫持可以不過需要你謹慎對待
故綜合考慮,這里選用最low的定時檢查。
uj5u.com熱心網友回復:
c#不能“監視變數",規范的做法是封裝在屬性中,觸發事件。在.netframework 框架體系中通常使用 INotifyPropertychanged介面,或者使用 ObservableCollection<> 型別等等機制來實作自己的可監聽物件。uj5u.com熱心網友回復:
“想當然的方式”看似高大上地玩兒底層,其實性能、封裝、穩定性、可調式器除錯、可編譯糾錯等工程方面,反而是業余的。所以真正的工程中其實是要平衡,要注重面向合同(介面)編程,而不要想當然地去追求什么入侵方法。轉載請註明出處,本文鏈接:https://www.uj5u.com/net/34546.html
標籤:C#
