2014-02-12 78 views
1

創建表達我有一個這樣的方法簽名:從反射型

IPostprocessComposer<T> Without<TProperty>(Expression<Func<T, TProperty>> propertyPicker) 

實例:

AutoFixture.Build<Request>() 
          .Without(p => p.ID) 
          .Create(); 

我想創建一個更靈活的解決方案並始終忽略從類型幾個屬性(在這種情況下「請求」)

我的(不工作)解決方案:

IPostprocessComposer<T> row = fixture.Build<T>(); 

var primitivePropertiesToIgnore = typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public) 
    .Where(p => p.Name.ToLowerInvariant().StartsWith("id") || p.Name.ToLowerInvariant().EndsWith("id")); 

foreach (var primitiveProperty in primitivePropertiesToIgnore) 
{ 
    var x = Expression.Parameter(typeof(T)); 
    var expr = Expression.Lambda(Expression.PropertyOrField(x, primitiveProperty.Name), x); 

    // This line is working, but of course I need "int" to be a generic type here... how can i achieve this? 
    row = row.Without((Expression<Func<T, int>>)expr); 
} 

問題: 我想表達必須以不同以某種方式傳遞給沒有方法,以工作?但是如何?

回答

2

,使這項工作的最簡單的方法是使用dynamic

row = row.Without((dynamic)expr); 

由於row已經是靜態類型,動態行爲將被包含到僅此聲明。

如果您不想使用dynamic,您需要使用反射來調用帶有正確類型參數的Without方法,但我認爲這樣做沒有任何優勢(它更復雜,但它不是沒有更多的類型安全)。

+0

YESSS .. THX :)) – David