LoginSignup
0
0

More than 5 years have passed since last update.

Propertyに動的にアクセスする

Last updated at Posted at 2017-05-17

各種Fwを自作してたりすると、Propertyに動的にアクセスするための手段がしばしば必要になります。
PropertyInfo.SetValue/GetValueでも実現できるのですが、実行速度がイマイチなのでDelegateを作成することをよくやります。

通常

Delegate.CreateDelegateを利用して、Propertyのgetter/setterをFunc/Actionとして取得します。

public static Func<TObj, TProp> GetGetter<TObj, TProp>(string propName)
    => (Func<TObj, TProp>)
        Delegate.CreateDelegate(typeof(Func<TObj, TProp>),
            typeof(TObj).GetProperty(propName).GetGetMethod());

public static Action<TObj, TProp> GetSetter<TObj, TProp>(string propName)
    => (Action<TObj, TProp>)
        Delegate.CreateDelegate(typeof(Action<TObj, TProp>),
            typeof(TObj).GetProperty(propName).GetSetMethod());

PCLの場合

PCLではDelegate.CreateDeleagteメソッドがないため、少しアクセス方法が変わります。

public static Func<TObj, TProp> GetGetter<TObj, TProp>(string propertyName)
    => (Func<TObj, TProp>)
        typeof(TObj).GetTypeInfo().GetDeclaredProperty(propertyName).GetMethod
                    .CreateDelegate(typeof(Func<TObj, TProp>)));

public static Action<TObj, TProp> GetSetter<TObj, TProp>(string propertyName)
    => (Action<TObj, TProp>)
        typeof(TObj).GetTypeInfo().GetDeclaredProperty(propertyName).SetMethod
                    .CreateDelegate(typeof(Action<TObj, TProp>)));

なお、作成したDelegateは適宜Cacheしておきましょう。
また、Propertyにはgetter/setterがない場合もあるので、目的によってはPropertyInfo.CanRead/CanWriteプロパティーを利用してアクセスできるかを確認するのも必要になるかもしれません。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0