2016-07-09 7 views
3

Wie übermittele ich im folgenden Code-Snippet mein Objekt als Parameter an die Methode im Skript?Wie übergibt man ein Objekt an ein Skript?

var c = new MyAssembly.MyClass() 
{ 
    Description = "test" 
}; 

var code = "using MyAssembly;" + 
      "public class TestClass {" + 
      " public bool HelloWorld(MyClass c) {" + 
      " return c == null;" + 
      " }" + 
      "}"; 

var script = CSharpScript.Create(code, options, typeof(MyAssembly.MyClass)); 
var call = await script.ContinueWith<int>("new TestClass().HelloWorld()", options).RunAsync(c); 
+0

Lesen Sie das Dokument zu übergeben: https://github.com/dotnet/roslyn/wiki/Scripting-API-Samples – Tommy

+0

Aber Sie scheint zu müssen Compiler, um Ihre Klasse zu kompilieren, anstatt eine Skript-Engine, um Code auszuführen. Verwenden Sie 'CSharpSyntaxTree.ParseText': http://www.tugberkugurlu.com/archive/compiling-c-sharp-code-into-memory-and-executing-it-with-roslyn – Tommy

+0

@Tommy Die Beispiele sollten wie das zu parametrisieren Skript, aber in meinem Fall möchte ich einen Parameter an die Methode übergeben, die die Beispiele nicht zeigen. ParseText scheint interessant, aber ich möchte nicht temporäre Assemblies erstellen, bevor Sie den Code ausführen. –

Antwort

2

Der Globals Typ sollte keine globalen Variablendeklarationen halten, wie es Eigenschaften ist.

Angenommen, Sie die richtigen Referenzen für Ihr Skript bekam:

var metadata = MetadataReference.CreateFromFile(typeof(MyClass).Assembly.Location); 

Option 1

Sie benötigen einen globalen var vom Typ MyClass zu definieren:

public class Globals 
{ 
    public MyClass C { get; set; } 
} 

Und verwenden Sie das als Globals Typ:

var script = 
    await CSharpScript.Create(
     code: code, 
     options: ScriptOptions.Default.WithReferences(metadata), 
     globalsType: typeof(Globals)) 
    .ContinueWith("new TestClass().HelloWorld(C)") 
    .RunAsync(new Globals { C = c }); 

var output = script.ReturnValue; 

Beachten Sie, dass in dem ContinueWith Ausdruck der eine C Variable sowie eine C Eigenschaft in Globals. Das sollte den Trick machen.


Option 2

In Ihrem Fall ist es sinnvoll, einen Delegierten zu erstellen, wenn Sie das Skript mehrmals aufrufen beabsichtigen:

var f = 
    CSharpScript.Create(
     code: code, 
     options: ScriptOptions.Default.WithReferences(metadata), 
     globalsType: typeof(Globals)) 
    .ContinueWith("new TestClass().HelloWorld(C)") 
    .CreateDelegate(); 

var output = await f(new Globals { C = c }); 

Option 3

In Ihrem Fall brauchen Sie nicht einmal Globals

var f = 
    await CSharpScript.Create(
     code: code, 
     options: ScriptOptions.Default.WithReferences(metadata)) 
    .ContinueWith<Func<MyClass, bool>>("new TestClass().HelloWorld") 
    .CreateDelegate() 
    .Invoke(); 

var output = f(c); 
+0

Große Antwort, wo alle Optionen wie erwartet funktionieren. Die Beispiele zeigen, was mit Roslyn möglich ist und sollten in die Proben aufgenommen werden. –