[英]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引用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的最后一次推送是数组的大小。
我猜您的意思是您想知道属性被调用后将返回的数组的大小?
我认为您无法明智地做到这一点。
如果属性具有条件,则它可以返回不同大小的数组,因此您必须对属性进行评估才能知道大小。 这可能有副作用,或者取决于对象中的其他值(或静态值)。
考虑一下这个:
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.