Я пытаюсь создать DbEntityEntry<T>
через отражение для целей тестирования. Его конструктор является внутренним, но я хотел бы назвать его и передать в объекте:Создание экземпляра DbEntityEntry <T> с отражением
public DbEntityEntry<T> Entry<T>(T entity) where T : class
{
Type constructedType = typeof(DbEntityEntry<T>);
BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Instance;
object x = Activator.CreateInstance(constructedType, flags, null, new object[] { entity }, null);
я получаю:
Конструктор по типу «System.Data.Entity.Infrastructure.DbEntityEntry`1 [ [System.Object, mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]] 'не найден.
Источник для конструктора:
internal DbEntityEntry(InternalEntityEntry internalEntityEntry)
{
DebugCheck.NotNull(internalEntityEntry);
_internalEntityEntry = internalEntityEntry;
}
Любой способ создания экземпляра?
UPDATE:
Исходный код был фактически снят с одного из предыдущих ответов Марк Gravell, но так как этот пост является кандидатом на близость, я представлю еще одну попытку, используя ответ на Gravell в предложении:
Type[] argTypes = new Type[] { typeof(T) };
object[] argValues = new object[] { entity };
BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Instance;
ConstructorInfo ctor = typeof (DbEntityEntry<T>).GetConstructor(flags, null, CallingConventions.Any, argTypes, null);
object obj = ctor.Invoke(argValues);
ctor
null, поэтому конструктор снова не найден.
Я верю, что это правильный путь для подхода. –
Если вы отрицаете ответ, объясните, почему. – Pawel
Я пишу тест для метода расширения, который у меня есть для DbEntityValidationException. Чтобы проверить его, мне нужно создать экземпляр DbEntityValidationResult, но для этого нужен экземпляр DbEntityEntry, и там я нашел этот вопрос SO. Я согласен с вами в изменении кода, но в моем сценарии я не вижу, как это сделать. Есть идеи? –