代码之家  ›  专栏  ›  技术社区  ›  brianc

动态生成程序集中的扩展方法?

  •  0
  • brianc  · 技术社区  · 16 年前

    我试图在动态生成的程序集中包含一个扩展方法静态类,除了我在第6行第28列中一直得到一个“预期类型”的编译器错误,这个错误恰好出现在单词“this”上。如果删除“this”,则不会返回错误(但它不是扩展方法)。

     public static void CodeDomDooDad()
        {
            using (var provider = new CSharpCodeProvider())
            {
                var compilerParameters = new CompilerParameters();
    
                compilerParameters.ReferencedAssemblies.Add("system.dll");
                compilerParameters.CompilerOptions = "/t:library";
                compilerParameters.GenerateInMemory = true;
    
                var sb = new StringBuilder();
    
                sb.Append("namespace MooCow \n{ \n");
                sb.Append("public static class Extensions {\n");
                sb.Append("public static string ToMoo(this string s) {\n");
                sb.Append("return s.Replace(\" \",\"moo\");\n");
                sb.Append("}\n");
                sb.Append("}\n");
                sb.Append("}\n");
    
                //Console.WriteLine(sb.ToString());
    
                var cr = provider.CompileAssemblyFromSource(compilerParameters, sb.ToString());
                if (cr.Errors.Count > 0)
                {
                    CompilerError error = cr.Errors[0];
                    Console.WriteLine(
                        "error:"+error.ErrorText + 
                        " line:" +error.Line + 
                        " col:" +error.Column + 
                        " isWarning:" + error.IsWarning);
                }
            }
        }
    

    这是生成的代码,工作正常。

    namespace MooCow {
    public static class Extensions
    {
        public static string ToMoo(this string s)
        {
            return s.Replace(" ", "moo");
        }
    }
    

    }

    1 回复  |  直到 15 年前
        1
  •  0
  •   brianc    15 年前

    我想我发现了,必须将编译器版本添加到CSharpProvider构造函数…var provider=new csharpcodeprovider(new dictionary()“compilerVersion”,“v3.5”)

    推荐文章