More Related Content
Similar to C#スクリプティングをアプリケーションで使用する
Similar to C#スクリプティングをアプリケーションで使用する (20)
C#スクリプティングをアプリケーションで使用する
- 2. 自己紹介
HN pierre3(ピエール)
C#好きなDevelopperで2児の父 / Xamarin初めました。
Github:https://github.com/pierre3/
Blog: http://pierre3.hatenablog.com/
Twitter: @pierusan2010
- 4. Roslyn C# Scripting
.Netアプリケーション内でC#のスクリプトを実行する機能
[NuGet] PM >Install-Package
Microsoft.CodeAnalysis.CSharp.Scripting
詳しくは
– Roslyn for Scriptingで、あなたのアプリケーションにもC#スクリプトを!!:kekyo
の丼
– C#スクリプト実行 : ++C++; //未確認飛行 C
- 8. private async Task Calculate()
{
ErrorMessages = "";
try
{
var script = CSharpScript.Create(CodeText, ScriptOptions.Default
.WithReferences(typeof(object).Assembly,typeof(Enumerable).Assembly)
.WithImports(
"System",
"System.Collections.Generic",
"System.Linq"),
typeof(ScriptingHost));
var scriptState = await script.RunAsync(scriptingHost);
Result = scriptState.ReturnValue.ToString();
Variables = new List<string>( scriptState.Variables.Select(x=>$"{x.Name}=
{x.Value}"));
}
catch(CompilationErrorException e)
{
ErrorMessages = e.ToString();
Result = "E";
}
}
await CSharpScript.Create(…).RunAsync(…);
で実行
最後の式(;は付けない)の評価の結果が、
RunAsync()の戻り値
ScriptState<object>.ReturnValue で受け取れ
る
スクリプト内で宣言した変数は
ScriptSate<object>.Variables で参照できる
スクリプトの実行結果を受け取る
- 11. CSVファイルのスキーマ(的なもの)をC#スクリプトで書く
CSVファイルをC#で扱うにはCsvHelperが便利!
– https://joshclose.github.io/CsvHelper/
柔軟な読み書き設定とクラスマッピング機能を有したCSVライブラリ
名前,生年月日,配偶者,性別,お小遣い
佐藤,1986/09/02,なし,男性,¥1000
鈴木,2001/08/10,なし,男性,¥500
高橋,1974/06/07,あり,女性,¥300
…
class Person
{
public string Name { get; set; }
public DateTime Birthday { get; set; }
public bool Married { get; set; }
public Sex Sex { get; set; }
public int PocketMoney { get; set; }
}
class PersonClassMap:CsvClassMap
{
public PersonClassMap()
{
Map(m => m.Name).Name("名前");
Map(m => m.Birthday).Name("生年 月日")
.TypeConverterOption("yyyy/MM/dd");
Map(m => m.Married).Name("配偶者")
.TypeConverterOption(true,"あり")
.TypeConverterOption(false,"なし");
Map(m => m.Sex).Name("性別");
Map(m => m.PocketMoney).Name("お小遣い")
.TypeConverterOption("C")
.TypeConverterOption(NumberStyles.Currency);
}
}
簡単な記述で、
きめ細かなクラ
スマップの設定
ができる
- 12. CSVファイルのスキーマ(的なもの)をC#スクリプトで書く
CsvHelperのクラスマッピングの設定部分をC#スクリプトとして切り出した
ら、そのままCSVのスキーマのように使えるのでは?
formatA
-,-,-,-,
-,-,-,-,
-,-,-,-,
formatB
-,-,-,-,
-,-,-,-,
-,-,-,-,
scriptA
scriptB
- 15. 課題
スクリプトの記述量が多い
– ちょっとしたファイルをさくっと表示したいだけでも、最低限の記述は必要
class FieldData
{
public string Name { get; set; }
public DateTime Birthday { get; set; }
public string Merried { get; set; }
public string Sex { get; set; }
public string PocketMoney { get; set; }
}
RegisterClassMap<FieldData>(classMap =>
{
classMap.Map( m => m.Name ).Name("名前");
classMap.Map( m => m.Birthday ).Name("生年月日");
classMap.Map( m => m.Merried ).Name("配偶者");
classMap.Map( m => m.Sex ).Name("性別");
classMap.Map( m => m.PocketMoney ).Name("お小遣い");
});
これはめんどい!
- 16. 最低限必要な記述は自動生成してしまおう!
T4 ランタイムテキストテンプレートを使用
– コード生成と T4 テキスト テンプレート
CSVのヘッダ部と1行目のデータを見て、マップするクラスとクラスマッピング
のテンプレートを自動生成する
ID,Name,Price
001,Apple,123
Class FieldData
{
double ID { get; set; }
string Apple { get; set; }
string Price { get; set; }
}
RegisterClassMap<FieldData>(classMap =>
{
classMap.Map( m => m.ID ).Name(“ID");
classMap.Map( m => m.Apple ).Name(“Apple");
classMap.Map( m => m.Price ).Name(“Price");
});