繁体   English   中英

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

[英]Length of string array via reflection

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

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

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

您有两件事在做……一旦有了数组,告诉数组的长度就很简单了。 您只需调用.Length (对于矢量)。

但是,您提到一个实例,并且正在显示一个实例属性。 这使我认为这是您缺少的包含对象。 在这种情况下。 您不能对null实例进行virtcall。 试图在类的实例成员上使用静态调用是非常邪恶的。 IIRC运行时将为此踢您。

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

也许您的意思是“没有确切的数组类型”。 C#数组都派生自Array ,因此您可以将Array引用ArrayArray并使用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的最后一次推送是数组的大小。

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

我认为您无法明智地做到这一点。

如果属性具有条件,则它可以返回不同大小的数组,因此您必须对属性进行评估才能知道大小。 这可能有副作用,或者取决于对象中的其他值(或静态值)。

考虑一下这个:

static public int n;

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM