这只是一个例子......我的“现实生活”例子要复杂得多。举个粗略的例子:
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);
}
是的,我在动态代码中确实拥有该结构的“副本”......
是否可以通过引用将此结构传递给动态代码?
答案 0 :(得分:3)
首先,我认为您希望这两个陈述的顺序相反 - 在您调用之后设置MI
没有多大意义...
但是,你应该只能在保留引用的object[]
中设置值 - 在调用之后,数组中的值将会发生变化。所以你想要:
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
}
}