-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);
誰能告訴我爲什麼我收到錯誤以及如何解決它?
與一上來編譯錯誤**不能從'System.DBNull'轉換爲'System.Reflection.FieldInfo'** – r3plica