1

这只是一个例子……我的“现实生活”例子要复杂得多。举个粗略的例子:

public struct _User
{
   public string FirstName;
   public string MiddleName;
   public string LastName;
}

我可以设置名称,然后通过引用函数来传递它。

但是,我想通过引用将数据结构传递到动态编译的代码中。

    public void RunScript(string ScriptName, ref _User stUser)
    {
        private Microsoft.CSharp.CSharpCodeProvider _compiler;
        public CompilerResults _compileResults;
        private static object _compiledAssembly;

        MI.Invoke(_compiledAssembly, new object[]{
            ref stUser }); // can't do a reference here...

        MI = _compiledAssembly.GetType().GetMethod(ScriptName);

    }

是的,我在动态代码中确实有该结构的“副本”......

是否可以通过引用将此结构传递到动态代码中?

4

1 回答 1

3

首先,我认为您希望这两个语句的顺序相反-在调用它MI 之后进行设置没有多大意义...

但是,您应该能够在object[]保留引用的 an 中设置值 - 在调用之后,数组中的值将发生变化。所以你要:

object[] args = { stUser; }
MI.Invoke(_compiledAssembly, args);
stUser = (_User) args[0]; // Or whatever you want to do with it

(你真的需要它成为一个结构吗?还有公共字段,不少于?)

顺便说一句,我对这部分有点不安:

是的,我在动态代码中确实有该结构的“副本”......

如果您的意思是在动态生成的程序集中定义了另一种类型,那就有问题了。这两种类型不会相同,即使它们具有相同的命名空间限定名称。您应该使动态生成的程序集引用包含该类型的程序集。您真的不希望在不同程序集中具有相同名称的两种类型 - 这将使调试变得非常痛苦......

编辑:简短但完整的示例:

using System;
using System.Reflection;

public struct MutableStruct
{
    public int x;
}

class Test
{
    public static void ChangeByRef(ref MutableStruct foo)
    {
        foo = new MutableStruct { x = 10 };
    }

    static void Main()
    {
        var args = new object[] { new MutableStruct() };
        var method = typeof(Test).GetMethod("ChangeByRef");
        method.Invoke(null, args);
        var changed = (MutableStruct) args[0];
        Console.WriteLine(changed.x); // Prints 10
    }
}
于 2013-07-07T20:41:30.283 回答