问题描述
我无法使此代码正常工作。似乎csharpscript.EvaluateAsync将无法理解Linq“选择”命令,即使我认为我正在向ScriptOptions添加适当的引用。这里的目标是使用EvaluateAsync运行基于字符串的Linq查询。多谢您的协助。
List<Dog> dogs = new List<Dog>();
dogs.Add(new Dog()
{ Name = "spike",Breed = "Poodle" });
dogs.Add(new Dog()
{ Name = "george",Breed = "Spaniel" });
dogs.Add(new Dog()
{ Name = "sammy",Breed = "Weimaraner" });
Console.WriteLine("Analyzing List");
// Func to return max string length of Breed Property in list of Dogs
int maxlen = dogs.Select(d => d.Breed.Trim().Length).OrderByDescending(d1 => d1).First();
// Recreated Func using Microsoft.CodeAnalysis.CSharp.Scripting.
var myLambda = "d => d.Select(d => d.Breed.Trim().Length).OrderByDescending(d1 => d1).First()";
Assembly[] assemblies = {
typeof(Dog).Assembly,System.Reflection.Assembly.Load("System.Collections"),System.Reflection.Assembly.Load("System.Linq"),System.Reflection.Assembly.GetExecutingAssembly()
};
ScriptOptions options = ScriptOptions.Default.AddReferences(
assemblies
);
Func<List<Dog>,int> DexpRSSn = await csharpscript.EvaluateAsync<Func<List<Dog>,int>>(myLambda,options);
/*
Error
Microsoft.CodeAnalysis.Scripting.CompilationErrorException
HResult=0x80131500
Message=(1,8): error CS1061: 'Dog' does not contain a deFinition for 'Select' and no accessible
extension method 'Select' accepting a first argument of type 'Dog' Could be found
(are you missing a using directive or an assembly reference?)
*/
解决方法
将程序集添加为引用是其中的一部分,但是要添加任何“使用指令”,则还应该使用AddImports()
:
//..
ScriptOptions options = ScriptOptions.Default.AddReferences(assemblies);
options = options.AddImports("System.Linq");
//..