2009-11-25 7 views
2

le type d'expression membre suivant peut parfois être NULLABLE, je ne suis pas vérifier que, mais je dois le convertir en un type non annulable,Linq: transformer le type de MemberExpression à ne pas annulable

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

Est-ce que quelqu'un sait comment?

Répondre

9

Vous pouvez utiliser Nullable.GetUnderlyingType pour vérifier (plus simplement) pour Nullable<T>, et il suffit d'utiliser GetValueOrDefault - comme ci-dessous (je n'ai inclus le Func<Foo,int> etc comme demo):

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

nice, cherchait quelque chose comme ça:) – Shawn

+0

Un peu en retard, mais c'était exactement ce qui a résolu un problème pour moi maintenant; Merci! –

1

Ceci est juste une supposition, mais pourriez-vous utiliser Nullable.GetValueOrDefault? Je ne suis pas sûr si le type de retour serait correct.

+0

Salut, merci pour répondre, je besoin de transformer membre en essentiellement membre, mais ce n'est pas un type nullable, ne pas réellement besoin de la valeur – roundcrisis

+0

ah ok je ne savais pas que vous deviez l'utiliser de cette façon merci – roundcrisis

Questions connexes