2016-04-25 124 views
-2

我已經看到了這個錯誤的可能的解決方案,但我只是不明白如何修復我的。 我的代碼如下所示:靜態字段需要空實例,非靜態字段需要非空實例。參數名稱:表達式

} 

/// <summary> 
/// Gets our data reader 
/// </summary> 
/// <param name="reader">The reader to return</param> 
/// <returns></returns> 
private Func<IDataReader, T> GetReader(IDataReader reader) 
{ 
    Delegate resDelegate; 

    // For each field, add to our columns 
    List<string> readerColumns = new List<string>(); 
    for (int index = 0; index < reader.FieldCount; index++) 
     readerColumns.Add(reader.GetName(index)); 

    // Determine the information about the reader 
    var readerParam = Expression.Parameter(typeof(IDataReader), "reader"); 
    var readerGetValue = typeof(IDataReader).GetMethod("GetValue"); 

    // Create a Constant expression of DBNull.Value to compare values to in reader 
    var dbNullValue = typeof(DBNull).GetField("Value"); 
    var dbNullExp = Expression.Field(Expression.Parameter(typeof(DBNull), "System.DBNull"), dbNullValue); 

    // Loop through the properties and create MemberBinding expressions for each property 
    List<MemberBinding> memberBindings = new List<MemberBinding>(); 
    foreach (var prop in typeof(T).GetProperties()) 
    { 
     // Determine the default value of the property 
     object defaultValue = null; 
     if (prop.PropertyType.IsValueType) 
      defaultValue = Activator.CreateInstance(prop.PropertyType); 
     else if (prop.PropertyType.Name.ToLower().Equals("string")) 
      defaultValue = string.Empty; 

     // If the column exists 
     if (readerColumns.Contains(prop.Name)) 
     { 

      // Build the Call expression to retrieve the data value from the reader 
      var indexExpression = Expression.Constant(reader.GetOrdinal(prop.Name)); 
      var getValueExp = Expression.Call(readerParam, readerGetValue, new Expression[] { indexExpression }); 

      // Create the conditional expression to make sure the reader value != DBNull.Value 
      var testExp = Expression.NotEqual(dbNullExp, getValueExp); 
      var ifTrue = Expression.Convert(getValueExp, prop.PropertyType); 
      var ifFalse = Expression.Convert(Expression.Constant(defaultValue), prop.PropertyType); 

      // Create the actual Bind expression to bind the value from the reader to the property value 
      var mi = typeof(T).GetMember(prop.Name)[0]; 
      var mb = Expression.Bind(mi, Expression.Condition(testExp, ifTrue, ifFalse)); 
      memberBindings.Add(mb); 
     } 
    } 

    // Create a MemberInit expression for the item with the member bindings 
    var newItem = Expression.New(typeof(T)); 
    var memberInit = Expression.MemberInit(newItem, memberBindings); 

    // Create the lambda expression 
    var lambda = Expression.Lambda<Func<IDataReader, T>>(memberInit, new ParameterExpression[] { readerParam }); 
    resDelegate = lambda.Compile(); 

    // Return our delegate 
    return (Func<IDataReader, T>)resDelegate; 
} 

,並正如標題所說,我得到的錯誤是:

靜態字段需要空實例,非靜態字段需要非空實例。參數名:表達

這是這一行:

var dbNullExp = Expression.Field(Expression.Parameter(typeof(DBNull), "System.DBNull"), dbNullValue); 

誰能告訴我爲什麼我收到錯誤以及如何解決它?

回答

1

答案是這樣的:

var dbNullExp = Expression.Field(expression: null, type: typeof(DBNull), fieldName: "Value"); 

因爲我使用.NET 4.5

0

您需要使用以下行:

var dbNullExp = 
    Expression.Field(Expression.Parameter(typeof(DBNull), "System.DBNull"), DBNull.value); 

它使用的DBNull的實例值。靜態字段需要空實例。 而不是使用它的反射,你可以只使用DBNull.value(例如值)

+0

與一上來編譯錯誤**不能從'System.DBNull'轉換爲'System.Reflection.FieldInfo'** – r3plica

相關問題