是否有可能知道字符串数组的长度 - 而没有对象实例 - 通过反射?
例如。在这种情况下:2。
public string[] Key
{
get { return new string[] { Name, Type }; }
}
编辑:好的,我不会尝试这样做,这没有多大意义。
答案 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" };
}
}
基本上,你必须运行代码。