我是ReaciveUI的新手,我正在进行一些模拟测试,试图查看其功能并围绕它建立一个框架来自动化某些事情。现在我已经达到了我想观察房产的地步,但我只知道它的名字。例如。
Joe-MacBook-Pro:~ joe$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
Joe-MacBook-Pro:~ joe$
是否有任何允许的WhenAny重载?我带来了一个快乐的想法(显然失败了):
public abstract class ViewModelBase : ReactiveObject
{
public ViewModelBase()
{
ObservePropertiesWithMyAttribute();
}
private void ObservePropertiesWithMyAttribute()
{
foreach(var prop in this.GetType().GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).Where(x => x.GetCustomAttribute<MyAttribute>() != null))
{
//Observe the property
}
}
}
但它抛出一个System.NotSupportedException:“不支持的表达式类型:常量”
我知道我可以通过PropertyChanged方法获得我想要的结果,但我很好奇是否有机会这样做。
答案 0 :(得分:0)
您可以构建表达式以按字符串访问属性。获得该表达式后,您可以将其传递给WhenAny
。这是一个例子:
class X : ReactiveObject
{
public X()
{
var propertyName = "A";
this.WhenAny(GetProperty<int>(propertyName), c => c.GetValue() * c.GetValue())
.Subscribe(i => Console.WriteLine(i));
}
int _a;
public int A
{
get { return _a; }
set { this.RaiseAndSetIfChanged(ref _a, value); }
}
private Expression<Func<X, T>> GetProperty<T>(string propertyName)
{
ParameterExpression param = Expression.Parameter(typeof(X));
Expression<Func<X, T>> expr = (Expression<Func<X, T>>)Expression.Lambda(
Expression.Property(param, propertyName),
param
);
return expr;
}
}