使用CodeDomCompiler编译程序集后,使用Reflection调用Guid参数的方法

时间:2014-07-11 09:39:45

标签: c# reflection compilation guid

我正在尝试从反射中调用一个方法:

bool ApproveUser(Guid userId)

我正在使用.NET CodeDomCompiler组件编译程序集,其中包含该方法的类所在,并且该方法正在编译为

{Void ApproveUser(System.String, Boolean ByRef, Boolean ByRef)} 

这与我的期望完全不同。 Guid参数和返回类型的这种正常行为是否会转换为类似的行为?任何提示都表示赞赏。谢谢!

编辑:调用方法:

Guid request = new Guid("25867C0D-F2FB-6A6A-AC61-FF0000852B58");
object[] args = new object[1] { request };
object classInstance= compilerResults.CompiledAssembly.CreateInstance("FooClass");
MethodInfo methodInfo = classInstance.GetType().GetMethod("ApproveUser");
bool result = (bool)methodInfo.Invoke(classInstance, args);

我希望方法成功调用,而是收到以下异常:

An exception of type 'System.Reflection.TargetParameterCountException' occurred in mscorlib.dll but was not handled in user code
Additional information: Parameter count mismatch.

编辑2:我将参数类型从Guid更改为int

public bool ApproveUser(int smthg)

编译版现在

{Void ApproveUser(Int32, Boolean, Boolean ByRef, Boolean ByRef)}

2 个答案:

答案 0 :(得分:2)

尝试使用GetMethod的{​​{3}}:

var methodInfo = classInstance.GetType()
                .GetMethod("ApproveUser", new[] { typeof(Guid) });

如果您的方法是私有的,请尝试指定BindingFlags

var methodInfo = classInstance.GetType()
                .GetMethod("ApproveUser", BindingFlags.Instance | BindingFlags.NonPublic);

答案 1 :(得分:0)

经过几次测试后,我发现CompileAssemblyFromDom中的CodeDomProvider方法在参数是程序集内的基本类型或结构时表现得很奇怪。因此,stringint等,以及他们的通讯员StringInt32和可空版本以及Guid,当设置为返回类型或方法中的参数类型将转换为类似于问题中提到的内容。我还测试了不同的随机类,当只使用真正的类时,方法头看起来与原始类似:

StreamWriter ApproveUser(Stream smthg)

将编译为

{System.IO.StreamWriter ApproveUser(System.IO.Stream)} 

这让我想到如果我使用object而不是我使用的原始类型,编译结果将是令人满意的。事实上,

object ApproveUser(object userId)

将编译为

{System.Object ApproveUser(System.Object)}

然后可以通过反射按照我期望的方式进行访问。 显然这是CodeDomProvider提供的编译过程中的某种问题。希望这也有助于其他人。