InvalidCastException, вероятно, вызвано переопределением неявного приведения в рамках фейков - PullRequest
0 голосов
/ 16 ноября 2018

Я столкнулся с некоторым странным поведением при использовании фальшивых фреймворков. Вероятно, это связано с этим блоком кода из фреймворка ms fakes:

    public static implicit operator T(ShimBase<T> shim)
    {
        using (ShimRuntime.AcquireProtectingThreadContext())
        {
            return (shim == null) ? null : shim.GetInstance();
        }
    }

Я пытался издеваться над ObjectSet соотв. ObjectQuery , выполнив это:

internal class MyObjectEnumerable<TEntity> : ShimObjectQuery<TEntity>, IDbAsyncEnumerable<TEntity>, IQueryable<TEntity>
{
    internal MyObjectEnumerable(ObjectQuery query) : base()
    {            
        var _ = new ShimObjectQuery(query);
        IncludeString = path => Instance;

        Bind(this.AsEnumerable());
        Bind(this.AsQueryable());
        Bind((IDbAsyncEnumerable<TEntity>)this);
    }

    /* further shim implementation */
}

internal class MyObjectQueryProvider<TEntity> : IDbAsyncQueryProvider
{
    public IQueryable CreateQuery(Expression expression)
    {
        // consuming the upper class
        var shim = new MyObjectEnumerable<TEntity>(_query);

        // this causes the InvalidCastExeption: MyObjectEnumerable<TEntity> to ObjectQuery in 
        // System.Data.Entity.QueryableExtensions.CommonAsNoTracking<T>(T source)
        return shim; 

        // this avoids the implicit cast and works
        return shim.Instance; 
    }

    /* further shim implementation */
}

Теперь, почему это так?

Потребовалось некоторое время, чтобы выявить эту ошибку. Я много исследовал, но не смог найти дополнительную информацию.

...