私は小さなテンプレート言語 (Razor によく似ています) を書いています。テンプレートのコンパイルでしなければならないことの 1 つは、(1) 完全修飾名または (2) 非修飾名 + 名前空間のいずれかに基づいて CLR 列挙型を解決することです。 . 例えば:
namespace Foo.Bar {
public enum MyEnum { A, B }
}
// template:
@using Foo.Bar;
@using System;
...
@Foo.Bar.MyEnum.A // fully qualified
@MyEnum.A // unqualified, but in one of the specified namespaces
私の現在のアプローチは、現在のアプリ ドメイン内のすべてのアセンブリをスキャンして列挙型を取得することです。これは次のようになります。
string[] namespaces = // parsed from template
string typeName = // parsed from template
string fieldName = // parsed from template
var possibleResolutions = from type in AppDomain.CurrentDomain.GetAssemblies()
.Where(a => !a.IsDynamic)
.SelectMany(a => a.GetTypes())
where type.IsEnum
from @namespace in namespaces
let fullName = @namespace + '.' + typeName
// the replace is because nested enum types (like we have in AptOne, will have a fullname of namespace.OuterClass+InnerClass)
where type.FullName.Replace('+', '.') == fullName
let field = type.GetField(fieldName, BindingFlags.Public | BindingFlags.Static)
where field != null;
これは、コールド スタートアップ (他のすべてのテンプレート コンパイル時間の大半を占める) では非常に遅くなる可能性があり、ほぼすべての時間が GetTypes() に費やされることがわかりました。そのようなルックアップを行うためのより高速な方法はありますか?
私はすでにこれらの結果をキャッシュしているので、そのような解決策には興味がないことに注意してください。