C# 将数组作为参数传递给方法
我试图在IL中生成一个setter,但是这个setter必须只接受我的“数组”中的字符串,否则,它必须抛出一个异常。我在传递数组以在checkIfAccept方法中读取时遇到问题,我确定我丢失了一条将数组指针存储在某个参数中的指令,但我不知道是哪条指令。 提前谢谢你,很抱歉我的问题C# 将数组作为参数传递给方法,c#,reflection.emit,C#,Reflection.emit,我试图在IL中生成一个setter,但是这个setter必须只接受我的“数组”中的字符串,否则,它必须抛出一个异常。我在传递数组以在checkIfAccept方法中读取时遇到问题,我确定我丢失了一条将数组指针存储在某个参数中的指令,但我不知道是哪条指令。 提前谢谢你,很抱歉我的问题 class Accept { public void CreateIL(ILGenerator il, FieldBuilder field, string [] array) { i
class Accept
{
public void CreateIL(ILGenerator il, FieldBuilder field, string [] array)
{
il.Emit(?);
il.Emit(OpCodes.Ldarg_1); // Push "value" on the stack
il.Emit(OpCodes.Ldarg_2); // suposed to push my array
il.Emit(OpCodes.Call, typeof(Accept).GetMethod("checkIfAccept"));
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldarg_1);
il.Emit(OpCodes.Stfld, field); // Set the field "_Name" to "value"
il.Emit(OpCodes.Ret);
}
public void checkIfAccept(string obj, string [] array)
{
foreach(string str in array)
if (str != obj) throw new MyException();
}
}
没有办法直接做到这一点。我能想到的最快的方法可能是某个地方的静电场。然后,您可以将其存储在那里并发出il以稍后加载(
ldsfld
)。这是一种真正全面的数据验证方法。但是,如果您真的想这样做,您必须在CreateIL
中迭代数组,并发出IL,该IL使用您传递的数组创建并填充数组。写一个set
方法做你想做的事情(现在就对数组进行硬编码),反编译它,并模拟这种情况-在硬编码数组中对你已经传递的内容进行子编译,大致如下:il.Emit(opcode.Ldc\u I4\u S,array.Length);il.Emit(操作码Newarr);对于(var i=0;i
@Rob如果我这样做,我必须将我的IfAccept参数更改为:“public void checkIfAccept(string obj,params string[]par”是吗?@AndréMoura你怎么会这么想?这应该是可行的,因为没有办法直接做到这一点。我能想到的最快的方法可能是某个地方的静电场。然后,您可以将其存储在那里并发出il以稍后加载(ldsfld
)。这是一种真正全面的数据验证方法。但是,如果您真的想这样做,您必须在CreateIL
中迭代数组,并发出IL,该IL使用您传递的数组创建并填充数组。写一个set
方法做你想做的事情(现在就对数组进行硬编码),反编译它,并模拟这种情况-在硬编码数组中对你已经传递的内容进行子编译,大致如下:il.Emit(opcode.Ldc\u I4\u S,array.Length);il.Emit(操作码Newarr);对于(var i=0;i
@Rob如果我这样做,我必须将我的IfAccept参数更改为:“public void checkIfAccept(string obj,params string[]par”是吗?@AndréMoura你怎么会这么想?它应该按原样工作