コードに[Flags]
の列挙型がいくつかあります。&貼り付けなしでJavaScriptに公開したいと思います。 SignalRは、リフレクションによって生成されたJavaScriptスタブを返すActionにURLをマッピングすることで、Hub-Proxiesと同様のことをしているようです。コードは実行時に生成されるため、バンドルに含めることはできないようです。代替案として列挙型のJavaScript表現を生成
は、私が設計時にJSファイルを生成するために、T4テンプレートを実装:
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="EnvDte" #>
<#@ import namespace="EnvDTE" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".js" #>
Enums = {
<#
var visualStudio = (Host as IServiceProvider).GetService(typeof(EnvDTE.DTE))
as EnvDTE.DTE;
var project = visualStudio.Solution.FindProjectItem(this.Host.TemplateFile)
.ContainingProject as EnvDTE.Project;
foreach(EnvDTE.ProjectItem item in GetProjectItemsRecursively(project.ProjectItems))
{
if (item.FileCodeModel == null) continue;
foreach(EnvDTE.CodeElement elem in item.FileCodeModel.CodeElements)
{
if (elem.Kind == EnvDTE.vsCMElement.vsCMElementNamespace)
{
foreach (CodeElement innerElement in elem.Children)
{
if (innerElement.Kind == vsCMElement.vsCMElementEnum)
{
CodeEnum enu = (CodeEnum)innerElement;
#> <#= enu.Name #>: {
<#
Dictionary<string, string> values = new Dictionary<string, string>();
foreach (CodeElement child in enu.Members)
{
CodeVariable value = child as CodeVariable;
if (value != null) {
string init = value.InitExpression as string;
int unused;
if (!int.TryParse(init, out unused))
{
foreach (KeyValuePair<string, string> entry in values) {
init = init.Replace(entry.Key, entry.Value);
}
init = "(" + init + ")";
}
values.Add(value.Name, init);
WriteLine("\t\t" + value.Name + ": " + init + ",");
}
}
#>
},
<#
}
}
}
}
}
#>
};
<#+
public List<EnvDTE.ProjectItem> GetProjectItemsRecursively(EnvDTE.ProjectItems items)
{
var ret = new List<EnvDTE.ProjectItem>();
if (items == null) return ret;
foreach(EnvDTE.ProjectItem item in items)
{
ret.Add(item);
ret.AddRange(GetProjectItemsRecursively(item.ProjectItems));
}
return ret;
}
#>
しかし、これはEnvDTE
と壊れやすい感じ。特に、以下のような列挙型を扱うロジックは:合成値を持つ列挙型のハックである。上記のT4テンプレートは次のように生成されます:
Enums = {
Access: {
None: 0,
Read: 1,
Write: 2,
ReadWrite: (1 | 2),
},
};
これを達成するためのよりクリーンな方法がありますか?理想的には、jsファイルを生成するためのデザイン時のリフレクションがバンドル可能です。
私は、T4ベースのアプローチよりも悪いと思っていました。あなたはコピーして貼り付けるだけでなく、ブラウザで魔法のURLにアクセスしてから、コピー&ペーストした後で再コンパイルしなければなりませんここで、T4にはrightclick->カスタムツールを実行するだけです – mensi
再コンパイルしません。ブラウザの更新だけ。マジックURLはありません。デバッグ時に表示されるリンクです。これは実際には本当にうまくいっていて、私が取り組んできたいくつかのチームが好評を博しています。 T4のテンプレートコードはかなり難解で、壊れやすく、保守が難しい傾向があります。私は両方のアプローチを使用し、カスタム属性ソリューションがはるかに効率的であることを発見しました。 –