通过反射的字符串数组的长度

时间:2011-03-30 09:19:18

标签: c# reflection

是否有可能知道字符串数组的长度 - 而没有对象实例 - 通过反射?
例如。在这种情况下:2。

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

编辑:好的,我不会尝试这样做,这没有多大意义。

3 个答案:

答案 0 :(得分:2)

你有两件事情......一旦你有一个数组,告诉数组的长度非常简单;你只需要调用.Length(如果是向量)。

但是,您提到了一个实例,并且您正在显示一个实例属性;这让我觉得它是你缺乏的内容。在哪种情况下......没有。你不能在null实例上做一个virtcall。并且尝试在类的实例成员上使用静态调用是非常邪恶的; IIRC运行时会为此启动。

但是,您可以通过添加static修饰符使其成为静态属性。然后,您只需将null作为实例传递给反射。

答案 1 :(得分:2)

也许你的意思是“没有阵列的确切类型”。 C#Arrays都派生自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 OpCodes的字节(例如https://gist.github.com/104001)。您正在寻找的OpCode是newarr。在newarr之前最后一次推送int32是数组的大小。

答案 2 :(得分:1)

我猜你的意思是你想知道属性在被调用时将返回的数组的大小?

我认为你不能理智地做到这一点。

如果属性有条件,那么它可以返回不同大小的数组,所以 你必须评估房产才能知道房屋大小。这可能有副作用或依赖于对象(或静态)中的其他值。

考虑一下: -

static public int n;

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

基本上,你必须运行代码。