2010-05-14 2 views
2

Как я могу эмулировать Expression.Default (новый в .NET 4.0) в 3.5?Expression.Default в .NET 3.5

Нужно ли вручную проверять тип выражения и использовать другой код для справки и типов значений?

Это то, что я сейчас делаю, есть ли лучший способ?

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

Не могли бы вы предоставить пример C# 4.0? –

+0

@Simon Expression.Default (typeof (int)) и Expression.Default (typeof (Window)) –

ответ

2

То, как вы это сделали, хорошо. Не существует метода Type.GetDefaultValue(), встроенного в .NET Framework, как и следовало ожидать, поэтому специальная обработка case для типов значений действительно необходима.

Также можно производить постоянное выражение для типов значений:

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

Преимущество этого я полагаю, будет то, что тип значения только инстанциирован один раз, когда выражение дерева построен, а чем каждый раз, когда выражение оценивается. Но это ничто.

+0

Мне нравится оптимизация, независимо от того, насколько малы :-) –

0

Как насчет использования метода расширения?

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); 
     } 
    } 
} 
+0

Ну, это то же самое, но с 'this' qualifier :-) Мне было интересно, был ли лучший способ (догадка не) –