#if NET20 || NET30 || !NET_4_6
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System.Diagnostics;
using System.Dynamic.Utils;
using LinqInternal.Core;
namespace System.Linq.Expressions.Reimplement
{
///
/// Represents a named parameter expression.
///
[DebuggerTypeProxy(typeof(ParameterExpressionProxy))]
public class ParameterExpression : Expression
{
private readonly string _name;
internal ParameterExpression(string name)
{
_name = name;
}
internal static ParameterExpression Make(Type type, string name, bool isByRef)
{
if (isByRef)
{
return new ByRefParameterExpression(type, name);
}
else
{
if (!type.IsEnum)
{
switch (type.GetTypeCode())
{
case TypeCode.Boolean:
return new PrimitiveParameterExpression(name);
case TypeCode.Byte:
return new PrimitiveParameterExpression(name);
case TypeCode.Char:
return new PrimitiveParameterExpression(name);
case TypeCode.DateTime:
return new PrimitiveParameterExpression(name);
case TypeCode.Decimal:
return new PrimitiveParameterExpression(name);
case TypeCode.Double:
return new PrimitiveParameterExpression(name);
case TypeCode.Int16:
return new PrimitiveParameterExpression(name);
case TypeCode.Int32:
return new PrimitiveParameterExpression(name);
case TypeCode.Int64:
return new PrimitiveParameterExpression(name);
case TypeCode.Object:
// common reference types which we optimize go here. Of course object is in
// the list, the others are driven by profiling of various workloads. This list
// should be kept short.
if (type == typeof(object))
{
return new ParameterExpression(name);
}
else if (type == typeof(Exception))
{
return new PrimitiveParameterExpression(name);
}
else if (type == typeof(object[]))
{
return new PrimitiveParameterExpression