从encodeom结果的方法中获取返回值

时间:2014-11-12 10:50:07

标签: c# reflection codedom

我使用codedom编译了.cs文件,并通过invokemember提取其方法。但我如何从该方法中获得价值?例如:我想获得已在方法

中创建的webcontrol

这是我的代码

    string[] filepath = new string[1];
        filepath[0] = @"C:\Users\xxxx\Documents\Visual Studio 2010\Projects\xxx\xx\invokerteks.cs";

        CodeDomProvider cpd = new CSharpCodeProvider();
        CompilerParameters cp = new CompilerParameters();
        cp.ReferencedAssemblies.Add("System.dll");
        cp.ReferencedAssemblies.Add("System.Web.dll");
        cp.GenerateExecutable = false;
        CompilerResults cr = cpd.CompileAssemblyFromFile(cp, filepath);

        if (true == cr.Errors.HasErrors)
        {
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
            {
                sb.Append(ce.ToString());
                sb.Append(System.Environment.NewLine);
            }
            throw new Exception(sb.ToString());
        }

        Assembly invokerAssm = cr.CompiledAssembly;
        Type invokerType = invokerAssm.GetType("dynamic.hello");
        object invokerInstance = Activator.CreateInstance(invokerType);

        invokerType.InvokeMember("helloworld", BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic, null, invokerInstance, null);

这是我的invokerteks.cs

    namespace dinamis
    {
public class halo
{
    private void halodunia()
    {
        System.Console.WriteLine("Hello World!!");

    }
}

}

你可以为我提供这个问题的链接教程吗?

1 个答案:

答案 0 :(得分:0)

InvokeMember将返回该方法返回的任何内容。由于您的helloworld方法返回void,因此不会返回任何内容。为了解决问题,请定义您的返回类型并像往常一样调用:

public class Hello
{
    private int helloworld()
    { 
        return new Random().NextInt();
    }
}

可以这样称呼:

var type = typeof(Hello);
int value = (int)type.InvokeMember("helloworld", BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic, null, invokerInstance, null);

InvokeMember始终返回object的实例,因此您必须转换为所需的类型。这里要注意无效的演员表。