C# 将数组作为参数传递给方法

C# 将数组作为参数传递给方法,c#,reflection.emit,C#,Reflection.emit,我试图在IL中生成一个setter,但是这个setter必须只接受我的“数组”中的字符串,否则,它必须抛出一个异常。我在传递数组以在checkIfAccept方法中读取时遇到问题,我确定我丢失了一条将数组指针存储在某个参数中的指令,但我不知道是哪条指令。 提前谢谢你,很抱歉我的问题 class Accept { public void CreateIL(ILGenerator il, FieldBuilder field, string [] array) { i

我试图在IL中生成一个setter,但是这个setter必须只接受我的“数组”中的字符串,否则,它必须抛出一个异常。我在传递数组以在checkIfAccept方法中读取时遇到问题,我确定我丢失了一条将数组指针存储在某个参数中的指令,但我不知道是哪条指令。 提前谢谢你,很抱歉我的问题

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你怎么会这么想?它应该按原样工作