Skip to content

Instantly share code, notes, and snippets.

@fiddyschmitt
Created November 21, 2020 12:58
Show Gist options
  • Save fiddyschmitt/d0316270bd74902839d6e8591d7e69c8 to your computer and use it in GitHub Desktop.
Save fiddyschmitt/d0316270bd74902839d6e8591d7e69c8 to your computer and use it in GitHub Desktop.
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