2017-01-31 20 views
1

私はRoslynスクリプトを使い始めましたが、ScriptOptionsクラスのImportsプロパティがどのように機能するかを理解するのに少し問題があります。名前空間全体をインポートするというコンセプトはうまくいきますが、インポートリストに個々のクラス名を追加すると、スクリプトの中でクラス名を完全修飾することなく使用することはできません。たとえば、次のように別名を使用したRoslynスクリプティング

エラー: "CS0103:名 '日時は' 現在のコンテキスト内に存在しない"

var scriptOptions = ScriptOptions.Default 
           .WithReferences(typeof(DateTime).Assembly) 
           .WithImports(typeof(DateTime).FullName); 

var script = CSharpScript.Create<DateTime>("DateTime.UtcNow", 
              scriptOptions); 

var now = script.RunAsync(null, CancellationToken.None).Result; 

成功:使用完全修飾型名

var scriptOptions = ScriptOptions.Default 
           .WithReferences(typeof(DateTime).Assembly) 
           .WithImports(typeof(DateTime).FullName); 

var script = CSharpScript.Create<DateTime>("System.DateTime.UtcNow", 
              scriptOptions); 

var now = script.RunAsync(null, CancellationToken.None).Result; 

成功:システム名前空間のインポート

var scriptOptions = ScriptOptions.Default 
           .WithReferences(typeof(DateTime).Assembly) 
           .WithImports("System"); 

var script = CSharpScript.Create<DateTime>("DateTime.UtcNow", 
              scriptOptions); 

var now = script.RunAsync(null, CancellationToken.None).Result; 

私がしたいのは、スクリプトが名前空間内のいくつかの型にしかアクセスできないようにスクリプトを制限することです。 System名前空間全体を利用できるようにしたいが、System.DateTimeSystem.Mathなどへのアクセスを許可するが、これらの型名を完全に修飾する必要はない。私は、usingステートメントをスクリプト自体に追加することも可能ですが、私は理想的には、スクリプトエンジンにこれを世話してもらいたいと思っています。

WithImportsメソッド(例:ScriptOptions.Default.WithImports("DateTime = System.DateTime"))でエイリアスを宣言しようとしましたが、コンパイルエラー(CS0246: The type or namespace name 'DateTime = System' could not be found (are you missing a using directive or an assembly reference?))が表示されます。

ドキュメントはかなり薄いようですが、source for the ScriptImports classは、名前空間、静的クラス、および別名をすべてインポートできることを示唆しています。私は何か愚かな何かここに明らかな何かを見逃している? Enfyveの有益なコメントに

UPDATE

おかげで、私は今、静的プロパティとメソッドにアクセスすることができますが、私はまだコンストラクタを呼び出すときに完全修飾名を使用する必要があります。

var scriptOptions = ScriptOptions.Default 
           .WithReferences(typeof(System.DateTime).FullName) 
           .WithImports("System.DateTime"); 

var script = CSharpScript.Create<object>("new DateTime()", scriptOptions); 

// Still throws CS0246 compiler error... 
var result = script.RunAsync(null, CancellationToken.None).Result.Dump(); 
+0

あなたの 'WithReferences'と' WithImports'では 'typeof(System.DateTime)...'を代わりに使用します – Enfyve

+0

ありがとうございますが、 'WithImports'は' IEnumerable 'と' params string [] '私は 'Type'を渡すことができません。 https://github.com/dotnet/roslyn/blob/master/src/Scripting/Core/ScriptOptions.cs#L262 –

+0

私は 'typeof(DateTime).Assembly'の代わりに' typeof(System.DateTime) .Assembly' – Enfyve

答えて

0

型の静的プロパティとメソッドにアクセスするには、それを別名であるのようにのようにインポートします。例えば: ので、この方法でオブジェクトを作成することはできません。.WithImports("System.DateTime")、その後"UtcNow"

しかし、これは本当タイプエイリアスディレクティブではありません(Issue #7451を参照)で。

関連する問題