Linq .NET3.5中的Expression.Default
如何模拟3.5中的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); } 使用扩
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))好吧,那是一样的,但是有一个这个限定符:-)我想知道是否有更好的方法(我猜不是)我喜欢优化,不管它有多小:-)