Длина массива строк через отражение - PullRequest
0 голосов
/ 30 марта 2011

Можно ли узнать длину строкового массива - без экземпляра объекта - с помощью отражения?
Например, в этом случае: 2.

public string[] Key
        {
            get { return new string[] { Name, Type }; }
        }

РЕДАКТИРОВАТЬ: хорошо, я не буду пытаться сделать это, это не имеет особого смысла.

Ответы [ 3 ]

2 голосов
/ 30 марта 2011

Возможно, вы имеете в виду «без точного типа массива». Все массивы C # происходят от Array, поэтому вы можете привести ссылку на массив к Array и использовать свойство Length.

Если вы действительно хотите отразить собственность,

var type = typeof(MyClass);
var prop = type.GetProperty("Key");
var method = prop.GetGetMethod();
var body = method.GetMethodBody();
var ils = body.GetILAsByteArray();

отсюда вам придется использовать одну из различных библиотек для декодирования байтов в IL-коды OpCode (например, https://gist.github.com/104001). Требуемый вами код операции newarr. Последнее нажатие int32 перед newarr - это размер массива.

2 голосов
/ 30 марта 2011

У вас там две вещи ... сказать, что длина массива довольно проста, если у вас есть массив;вы просто вызываете .Length (в случае вектора).

Однако вы упоминаете экземпляр, и вы показываете свойство экземпляра;что заставляет меня думать, что это сдерживающий объект, которого вам не хватает.В этом случае ... нет.Вы не можете сделать virtcall на нулевом экземпляре.И попытка использовать static-call на экземпляре члена класса очень зла;IIRC среда выполнения вас за это пинает.

Однако вы можете сделать его статическим свойством, просто добавив модификатор static.Тогда вы просто передаете null как пример для отражения.

1 голос
/ 30 марта 2011

Я предполагаю, что вы хотите знать размер массива, который будет возвращать свойство, если оно было вызвано?

Я не думаю, что вы можете сделать это разумно.

Если свойство было условным, оно могло бы возвращать массивы разного размера, поэтому вам нужно оценить свойство, чтобы узнать размер. Которые могут иметь побочные эффекты или зависеть от других значений объекта (или статики).

Рассмотрим это: -

static public int n;

public string[] Key
{
  get {
    if (n > 1)
      return new string[] { "Name", "Type" };
    else
      return new string[] { "Name", "Type", "Cheese" };
  }
}

По сути, вам придется запустить код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...