我有一个string input;
带有一些代码的字符串(以下所有内容都在该字符串中)
var x = s.IndexOf("a");
return String.Format(s, x);
现在,我想实现以下场景:
Func<string, string> f = Compile(input);
var test = "dcba - {0}";
var result = f(test);
// result = "dcba - 3";
我假设实际的 T1、TResult 是已知的(这里:字符串、字符串),并且该输入被命名为“s”。我可以这样实现:
var input = "var x = s.IndexOf(\"a\"); return String.Format(s, x);";
var containerClass = @"using System; class TempClass {{ public string temp_func(string s){{ {0} }} }}";
var code = String.Format(containerClass, input);
// Create a new instance of the C# compiler
var compiler = new CSharpCodeProvider();
var params = new CompilerParameters
{
GenerateExecutable = false,
GenerateInMemory = true
};
params.ReferencedAssemblies.Add("System.dll");
var results = compiler.CompileAssemblyFromSource(params, code);
Func<string, string> f;
if (results.Errors.Count == 0)
{
f = s =>
{
var myClass = results.CompiledAssembly.CreateInstance("TempClass");
return (string) myClass.GetType().
GetMethod("temp_func").
Invoke(myClass, new object[] {s});
};
// test:
Console.WriteLine(f(Console.ReadLine()));
}
但这是相当复杂的方式。如果我知道我只想要一个Func<T1, TResult>
,而不是整个编译的程序集,实例化类(或调用一个静态方法),有什么方法可以简化这一点?
当然,我可以使用这段代码,并把它打扮得很好——将它包装在一个泛型类中,获取 T1、TResult 类型名称以放入TempClass
模板(String.Format("public {0} temp_func({1} s)",typeof(TResult).Name, typeof(T1).Name);
)中,但它有一种润滑方形轮轴的感觉骑行更顺畅...