public void ChangeInputType_Default_ReturnsExpectedResult()
        {
            // arrange
            var collection = new[]
            {
                new T2 {
                    Foo = "Foo"
                },
                new T2(),
                new T2 {
                    Foo = "Bar"
                },
                new T2 {
                    Foo = "Baz"
                },
            };
            Expression <Func <T1, bool> > filter = p => p.Foo == "Bar";

            // act
            var result = ExpressionHelper.ChangeInputType <T1, T2, bool>(filter);

            // assert
            collection.AsQueryable().Where(result).Should().ContainSingle(r => r.Foo == "Bar");
        }
 /// <summary>
 /// Konkretisiert den Typen des Parameters der Expression.
 /// </summary>
 /// <typeparam name="TBefore">Typ des Parameters in der ursprünglichen Expression.</typeparam>
 /// <typeparam name="TAfter">Konkreterer Typ für den Parameter der resultierenden Expression.</typeparam>
 /// <typeparam name="TResult">Typ des Rückgabewerts der Expression.</typeparam>
 /// <param name="expression">Expression, deren Parametertyp konkretisiert werden soll.</param>
 /// <returns>Expression, die identisch zur ursprünglichen Expression ist, aber einen konkreteren Parametertypen definiert.</returns>
 /// <remarks>Zur Verwendung von allgemein definierten Expressions für konkretere Typen, da die Kovarianz nicht automatisch aufgelöst werden kann.</remarks>
 public static Expression <Func <TAfter, TResult> > ChangeInputType <TBefore, TAfter, TResult>(this Expression <Func <TBefore, TResult> > expression)
     where TAfter : TBefore
 {
     return(ExpressionHelper.ChangeInputType <TBefore, TAfter, TResult>(expression));
 }