2013-10-21 18 views
1

考慮下面的語句:調用,在C#中使用了表達式和代表在其參數的擴展方法

recorder.AddActivity(new Activity { ActivityName = "DeepSeaDiving", DayOfWeek = DayOfWeek.Monday }); 

取而代之的是,有一個帖子here,用Expression Trees花式呼是這樣的:

WeeklyActivityRecorder weeklyActivities = new WeeklyActivityRecorder() .WithActivities(Monday => "Lawn Moving",Tuesday => "Cooking"); 

我看到了擴展方法here,它在下面給出。

public static WeeklyActivityRecorder WithActivities(this WeeklyActivityRecorder recorder, params Expression<Func<DayOfWeek, string>>[] activityList) 
    { 
    foreach (var activity in activityList) 
       { 
        LambdaExpression expression = activity; 
        ConstantExpression enteredActivity = expression.Body as ConstantExpression; 
        DayOfWeek day = expression.Parameters[0]; 
        recorder.AddActivity(new Activity{DayOfWeek = day, ActivityName = activity}); 
       } 

       return recorder; 
    } 

但是,當我編譯,編譯器是不滿意的擴展方法,並抱怨說,'不能sourceType的ParameterExpression轉換爲DAYOFWEEK

任何想法我在這裏失蹤?

+0

局部變量做你不能使用相同的參數名稱。在lambda中''day'你聲明參數名稱,它應該是不同的。 –

+0

[在C#中使用表達式作爲其參數之一調用擴展方法]的可能重複(http://stackoverflow.com/questions/19490247/invoking-an-extension-method-with-an-expression-as-one -of-its-parameter-in-c-sha) –

回答

1

你需要傳遞參數,但您嘗試創建拉姆達,其中的參數名稱是靜態屬性,這大致相當於:

public string SomeMethodName(DayOfWeek.Monday) //incorrect method declaration 
{ 

} 

你需要調用WithActivities方法類似

recorder.WithActivities(dayOfWeek => "LawnMoving"); //dayOfWeek is a parameter name 

如果您需要將轉換方法從DayOfWeek轉換爲String,則可以使用以下詞典:

var recorder = new WeeklyActivityRecorder(); 

var daysTranslation = new Dictionary<DayOfWeek, string>() 
{ 
    {DayOfWeek.Monday, "LawnMoving"} 
    //other pairs 
}; 

recorder.WithActivities(dayOfWeek => daysTranslation[dayOfWeek]); 
+0

感謝您的好解釋(在第一個模塊中)。但是,請參閱我的編輯。 'dayOfWeek'也不起作用。 –

+0

@nowhewhomustnotbenamed。爲什麼'dayOfWeek'不起作用? –

+0

@Ilaya Ivanov:我試過了,就像在第二個塊中給出的那樣,聲明瞭一個名爲'dayOfWeek'的局部變量,然後將它傳入裏面。但是,編譯器並不開心。 –

3

你需要通過一個合法的lambda ..你正在傳遞的實際DayOfWeek

recorder.WithActivities(lambda_variable_here => "LawnMoving"); 
+0

感謝您的回答。但是,什麼'lambda_variable_here'是什麼意思? –

+0

我會建議你在繼續之前閱讀lambda表達式。它們是比SO允許的更大的話題。 –

+2

@nowhewhomustnotbenamed。我建議你閱讀[Lambda表達式(C#編程指南)](http://msdn.microsoft.com/en-us/library/vstudio/bb397687.aspx)以瞭解什麼是lambda變量和lambda表達式 –

相關問題