2009-11-25 74 views
2

以下成员表达式类型有时是空的,我米检查,但是我需要将其转换为非可空类型,的Linq:变换memberExpression类型不可空

MemberExpression member = Expression.Property(param, something); 
var membertype = member.Type; 
if (membertype.IsGenericType && membertype.GetGenericTypeDefinition() == typeof(Nullable<>)) 
     { // convert to not nullable type?... 

有谁知道怎么样?

回答

9

您可以使用Nullable.GetUnderlyingType检查(更简单)为Nullable<T>,并且只使用GetValueOrDefault - 像下面(我只包括了Func<Foo,int>等为演示):

using System; 
using System.Linq.Expressions; 
class Foo { 
    public int? Bar { get; set; } 

    static void Main() { 
     var param = Expression.Parameter(typeof(Foo), "foo"); 
     Expression member = Expression.PropertyOrField(param, "Bar"); 
     Type typeIfNullable = Nullable.GetUnderlyingType(member.Type); 
     if (typeIfNullable != null) { 
      member = Expression.Call(member,"GetValueOrDefault",Type.EmptyTypes); 
     } 
     var body = Expression.Lambda<Func<Foo, int>>(member, param); 

     var func = body.Compile(); 
     int result1 = func(new Foo { Bar = 123 }), 
      result2 = func(new Foo { Bar = null });  
    } 
} 
+0

不错,正在寻找类似的东西:) – Shawn 2009-11-25 18:47:59

+0

有点晚了,但这正是我现在解决的一个问题;谢谢! – 2014-02-13 13:52:36

1

这只是一个猜测,但可以使用Nullable.GetValueOrDefault吗?我不确定返回类型是否正确。

+0

您好,感谢回答,我需要将会员转换为基本会员,但这不是一个可空的类型,实际上并不需要值 – roundcrisis 2009-11-25 16:48:31

+0

啊好吧,不知道你必须这样使用它,谢谢 – roundcrisis 2009-11-25 16:57:03