У меня есть эти классы:Получить статическое поле из вложенного класса с помощью дерева выражений
public class Entity
{
public static readonly EntitySchema Schema = new EntitySchema();
}
public abstract class BaseSchema
{
public abstract string Name {get;}
}
public class EntitySchema : BaseSchema
{
public override string Name => "Schema";
}
Теперь я хочу, чтобы получить доступ к EntitySchema.Name
от метода, который ничего не знаю о сущности (не может получить доступ к статическому полю) не знает.
Я мог бы сделать это с отражением:
static BaseSchema GetSchema<T>()
{
var pr = typeof(T).GetField("Schema");
var schema = pr.GetValue(null);
return schema as BaseSchema;
}
, но по сравнению с прямым вызовом Entity.Schema.Name
от версии отражения 50x медленнее.
Есть ли способ конвертировать версию отражения в Дерево выражений и предварительно скомпилировать вызов?
Спасибо, что сработало! Запуск скомпилированной версии var f = MakeDelegate() теперь составляет около 44 мс для вызовов 10mio вместо 1250 мс! –