Realmente no puedo imaginar éste ...Reflexión: método con el argumento genérico y expresión lambda como parámetro
estoy tratando de lograr el siguiente resultado utilizando la reflexión:
_builder.Entity<Post>().HasKey(p => p.Id);
Let Me introduzco las variables ... _builder
es del tipo DbModelBuilder
y Post
tiene una propiedad Id
del tipo Guid
.
En el siguiente código contentType
, se ajusta un System.Type
:
var config = _builder.GetType()
.GetMethod("Entity")
.MakeGenericMethod(contentType.Type)
.Invoke(_builder, null);
var hasKey = config.GetType().GetMethod("HasKey");
var expressionKey = typeof(Expression<>)
.MakeGenericType(typeof(Func<,>)
.MakeGenericType(contentType.Type, typeof(Guid)));
var paramEx = Expression.Parameter(contentType.Type, "t");
var lambdaEx = Expression.Lambda(Expression.Property(paramEx, "Id"), paramEx);
hasKey.MakeGenericMethod(typeof(Guid))
.Invoke(_builder, new[] { lambdaEx });
HasKey
definición podría ayudar a:
public EntityTypeConfiguration<TEntityType> HasKey<TKey>(Expression<Func<TEntityType, TKey>> keyExpression);
... donde TEntityType
debe ser de tipo Post
y TKey
de tipo Guid
..
Excepción de tipo TargetException
se lanza (en la última llamada a Invocar anterior):
El objeto no coincide con el tipo de destino.
He intentado todas las ideas que pude encontrar y todavía no puedo hacer corresponder el tipo de objetivo.
Cualquier ayuda es apreciada.
Por no ser rubia aquí, pero ¿el parámetro de la instancia del último invoke no debería ser config en lugar de _builder? :) – Polity
Simplemente curioso ya que encuentro la idea intrigante. ¿Estás tratando de crear algún tipo de EF ModelBuilder dinámico? – Polity
jaja Skeet todavía está durmiendo, lo que me permite ganar algunos puntos;) – Polity