Re[2]: Silverlight & NonPublic Property
От: Пельмешко Россия blog
Дата: 09.10.09 12:27
Оценка: 156 (8)
Здравствуйте, Пельмешко, Вы писали:

П>Это ограничение рефлексии в Silverlight.


Если уж совсем надо, то можно сделать раз:
  static class Silverhack
  {
    public static Func<T,TField>
      CreatePrivateFieldAccessor<T,TField>(string fieldName)
    {
      var objType = typeof(T);
      var fieldInfo = objType.GetField(
        fieldName,
        BindingFlags.Instance | BindingFlags.NonPublic);

      if (fieldInfo == null)
      {
        throw new ArgumentException(
          string.Format("Field {0} doesn't exist!", fieldName));
      }

      var arg = Expression.Parameter(objType, "obj");

      return Expression.Lambda<Func<T, TField>>(
        Expression.Field(arg, fieldInfo), arg).Compile();
    }
  }

..ии два:
  class Foo
  {
    int a;
    public Foo(int a) { this.a = a; }
  }

var accessor = Silverhack.CreatePrivateFieldAccessor<Foo, int>("a");
int privateValue = accessor(new Foo(55)); // == 55


Фишка в том, что Expression<TDelegate> компилирует DynamicMethod с отключенными проверками видимости Самому такой DynamicMethod не создать, нужный конструктор отмечен [SecurityCritical] По мне — так это тянет на серьёзную брешь, так как никак иначе к не публичным методам/полям не добраться, а Expression может всё...

p.s. Проверял только в Silverlight 2.0
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.