Отражение: метод с общим аргументом и лямбда-выражением в качестве параметра - PullRequest
5 голосов
/ 19 октября 2011

Я действительно не могу понять это ...

Я пытаюсь добиться следующего результата с помощью отражения:

_builder.Entity<Post>().HasKey(p => p.Id);

Позвольте мне представить переменные ... _builder имеет тип DbModelBuilder, а Post имеет свойство Id типа Guid.

В приведенном ниже коде contentType переносит 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 определение может помочь:

public EntityTypeConfiguration<TEntityType> HasKey<TKey>(Expression<Func<TEntityType, TKey>> keyExpression);

... где TEntityType должно быть типа Post и TKey типа Guid ...

Выдается исключение типа TargetException (при последнем вызове Invoke выше):

Объект не соответствует типу цели.

Я испробовал каждую идею, которую смог придумать, и все равно не могу соответствовать типу цели.

Любая помощь приветствуется.

Ответы [ 2 ]

2 голосов
/ 19 октября 2011

В последнем вызове Invoke вы указали неверный параметр экземпляра.Должно быть «config», а не «_builder»

0 голосов
/ 19 октября 2011

Глупый я, у меня нет оправданий ...

Структура и отражение сущности с практическими рекомендациями:

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 });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...