Linq .NET3.5中的Expression.Default

Linq .NET3.5中的Expression.Default,linq,.net-3.5,Linq,.net 3.5,如何模拟3.5中的Expression.Default(在.NET 4.0中新增) 我是否需要手动检查表达式类型,并对引用和值类型使用不同的代码 这就是我目前正在做的,有更好的方法吗 Expression GetDefaultExpression(Type type) { if (type.IsValueType) return Expression.New(type); return Expression.Constant(null, type); } 使用扩

如何模拟3.5中的
Expression.Default
(在.NET 4.0中新增)

我是否需要手动检查表达式类型,并对引用和值类型使用不同的代码

这就是我目前正在做的,有更好的方法吗

Expression GetDefaultExpression(Type type)
{
    if (type.IsValueType)
        return Expression.New(type);
    return Expression.Constant(null, type);
}

使用扩展方法怎么样

using System;
using System.Linq.Expressions;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            Type t = typeof(int);
            Expression e = t.Default(); // <-----
            Console.WriteLine(e);
            t = typeof(String);
            e = t.Default();            // <-----
            Console.WriteLine(e);
            Console.ReadLine();
        }
    }

    public static class MyExtensions
    {
        public static Expression Default(this Type type)
        {
            if (type.IsValueType)
                return Expression.New(type);
            return Expression.Constant(null, type);
        }
    } 
}
使用系统;
使用System.Linq.Expressions;
命名空间控制台应用程序3
{
班级计划
{
静态void Main(字符串[]参数)
{
类型t=类型of(int);

表达式e=t.Default();//您这样做是很好的。在.NET Framework中没有像人们所期望的那样内置Type.GetDefaultValue()方法,因此确实需要对值类型进行特殊的大小写处理

也可以为值类型生成常量表达式:

Expression GetDefaultExpression(Type type) 
{ 
    if (type.IsValueType) 
        return Expression.Constant(Activator.CreateInstance(type), type); 
    return Expression.Constant(null, type); 
} 

我想这样做的好处是,在首次构建表达式树时,值类型只实例化一次,而不是每次计算表达式。但这是挑剔。

您能提供一个C#4.0示例吗?@Simon expression.Default(typeof(int))和expression.Default(typeof(Window))好吧,那是一样的,但是有一个
这个
限定符:-)我想知道是否有更好的方法(我猜不是)我喜欢优化,不管它有多小:-)