2011-10-19 14 views
5

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.

+0

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

+0

Simplemente curioso ya que encuentro la idea intrigante. ¿Estás tratando de crear algún tipo de EF ModelBuilder dinámico? – Polity

+0

jaja Skeet todavía está durmiendo, lo que me permite ganar algunos puntos;) – Polity

Respuesta

2

En su última llamada a Invocar, ha especificado el parámetro de instancia incorrecto. Que debería ser 'config' en lugar de '_builder'

0

Tonto de mí, no tengo excusas ...

How-to Entity Framework & Reflexión:

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(config, new[] { lambdaEx }); 
Cuestiones relacionadas