我试图通过反射创建一个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
为空,所以再次找不到构造函数。
我确实认为这是正确的途径。 – 2014-10-17 16:49:48
如果您不满意答案,请解释原因。 – Pawel 2016-03-01 16:34:24
我正在为DbEntityValidationException的扩展方法编写一个测试。为了测试它,我需要创建一个DbEntityValidationResult的实例,但这需要一个DbEntityEntry的实例,并且在那里我发现了这个问题。我同意你关于改变代码,但在我的情况下,我不明白我该怎么做。有任何想法吗? – 2017-01-24 21:58:26