我想構建一個具有不同輸入參數類型的表達式字典。我試圖存儲參數的類型,因爲後來我打算使用Reflection來發現類型上的方法。下面是創建字典中的代碼,我創建的條目添加到它的通用增加功能:如何將表達式<Func <T, bool>>轉換爲表達式<Func <Type, bool>>?
public class LoadEntityQuery : IQuery<LoadEntityQueryResult>
{
public IDictionary<Type, Expression<Func<Type, bool>>> Entities { get; set; }
public LoadEntityQuery()
{
Entities = new Dictionary<Type, Expression<Func<Type, bool>>>();
}
public void Add<T>(Expression<Func<T, bool>> where = null) where T : Entity
{
Expression<Func<Type, bool>> _lambda = null;
if (where != null)
{
ParameterExpression param = Expression.Parameter(typeof(T), where.Parameters[0].Name);
var body = Expression.Invoke(where, param);
_lambda = Expression.Lambda<Func<Type, bool>>(body, param);
}
Entities.Add(typeof(T), _lambda);
}
}
新方法的主體正確創建。問題是當我嘗試創建新的Lambda表達式時,表達式的類型被傳入,我收到此錯誤:
類型'TestNamespace.TestClass'的ParameterExpression不能用於'System'類型的委託參數。類型'
有沒有人有一個想法,我可以在這種情況下做什麼?就像我之前說過的,稍後我會循環閱讀這本詞典,對每個條目做一些反思性編程。如果有更好的方法來做到這一點,我是全部耳朵。
至於是什麼,我試圖做一個例子,我存儲凡需要POCO對象的條款進行初始化表達式:
LoadEntityQuery _query = new LoadEntityQuery();
_query.Add<PayrollLocation>();
_query.Add<PayrollGroupBU>();
_query.Add<PersonnelPosition>(t => t.DataSet == MasterDataSet);
_query.Add<EmployeeStatus>();
_query.Add<PayrollGrade>();
實體的這份名單將是每個應用程序不同。這個想法是收集所有的實體和Where子句,並在每個實體上使用反射來發現某種方法。 (例如,PayrollLocation有一個GetPayrollLocationsQuery()方法,PayrollGroupBU有一個GetPayrollGroupBUQuery()方法...)。 Add方法是通用的,以便在調用代碼中使用lambda表達式。
感謝, 傑森
完美!謝謝傑夫 - 這是一個真正的幫助(正如你的其他職位)。我對LambdaExpressions有很多瞭解,對他們來說我還是比較陌生。感謝您的幫助。 – Rockdocta 2011-05-11 01:19:19