Created
November 21, 2020 12:58
-
-
Save fiddyschmitt/d0316270bd74902839d6e8591d7e69c8 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var dObj = (dynamic)obj; | |
var filter = CreateFilterDelegate<object>(@"dObj.Name.StartsWith(""P"") && dObj.HeightCm >= 180"); | |
var matchesFilter = filter(new Globals(dObj)); | |
Console.WriteLine($"{dObj.Name}: {matchesFilter.Result}"); | |
var proj = CreateSelectDelegate<object>(@"new {dObj.Name.ToUpper(), HeightMm = dObj.HeightCm * 1000}"); | |
var transformed = proj(new Globals(proj)); | |
Console.WriteLine($"{transformed.Result}"); | |
public static ScriptRunner<T> CreateFilterDelegate<T>(string filterStatement) | |
{ | |
var filter = @$" | |
public bool MatchesFilter() | |
{{ | |
var result = {filterStatement}; | |
return result; | |
}}"; | |
var assemblies = new[] | |
{ | |
MetadataReference.CreateFromFile(typeof(System.Runtime.CompilerServices.DynamicAttribute).Assembly.Location), | |
MetadataReference.CreateFromFile(typeof(Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo).Assembly.Location), | |
}; | |
var del = CSharpScript.Create<T>( | |
code: filter, | |
options: ScriptOptions.Default.WithReferences(assemblies), | |
globalsType: typeof(Globals) | |
) | |
.ContinueWith<T>("MatchesFilter()") | |
.CreateDelegate(); | |
return del; | |
} | |
public static ScriptRunner<T> CreateSelectDelegate<T>(string selectStatement) | |
{ | |
var filter = @$" | |
public dynamic Select() | |
{{ | |
var result = (dynamic){selectStatement}; | |
return result; | |
}}"; | |
var assemblies = new[] | |
{ | |
MetadataReference.CreateFromFile(typeof(System.Runtime.CompilerServices.DynamicAttribute).Assembly.Location), | |
MetadataReference.CreateFromFile(typeof(Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo).Assembly.Location), | |
}; | |
var del = CSharpScript.Create<T>( | |
code: filter, | |
options: ScriptOptions.Default.WithReferences(assemblies), | |
globalsType: typeof(Globals) | |
) | |
.ContinueWith<T>("Select()") | |
.CreateDelegate(); | |
return del; | |
} | |
public class Globals | |
{ | |
public dynamic sdo; | |
public Globals(dynamic obj) | |
{ | |
sdo = obj; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment