我試圖通過反射創建一個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