WhenAny按属性名称

时间:2017-08-29 09:37:04

标签: c# reactiveui

我是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方法获得我想要的结果,但我很好奇是否有机会这样做。

1 个答案:

答案 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;
    }
}