How do I require that all of the objects in a parameter array be passed as out? In my following code, I know that it’s failing because my original parameters never get assigned and are thus null. Even though I would think they’d be passed as reference without having to explicitly say so, they don’t seem to be. As a result, I’ve had to try and pass all of it as an out parameter.
Here’s the parts of my code that I think matter.
ChatController(some elements removed)
class ChatController : ControllerBase
{
#region Views
ChatAreaView viewChatArea;
UserListView viewUserArea;
MessageView viewMessageArea;
LoginPromptView viewLoginPrompt;
#endregion
#region ViewModels
ChatAreaViewModel viewModelChatArea;
UserAreaViewModel viewModelUserArea;
MessageAreaViewModel viewModelMessageArea;
LoginPromptViewModel viewModelLoginPrompt;
#endregion
public override void CreateViewsAndViewModels()
{
//InitializeViewAndViewModel(out viewChatArea, out viewModelChatArea);
//InitializeViewAndViewModel(out viewMessageArea, out viewModelMessageArea);
//InitializeViewAndViewModel(out viewUserArea, out viewModelUserArea);
//InitializeViewAndViewModel(out viewLoginPrompt, out viewModelLoginPrompt);
InitializeViewsAndViewModels(new FrameworkElement[] { viewChatArea, viewUserArea, viewMessageArea, viewLoginPrompt },
new object[] { viewModelChatArea, viewModelUserArea, viewModelMessageArea, viewModelLoginPrompt });
}
}
ControllerBase(some elements removed)
public abstract class ControllerBase : PrismBase
{
public void InitializeViewAndViewModel<TView, TViewModel>(out TView view, out TViewModel viewModel)
where TView : FrameworkElement, new()
where TViewModel : new()
{
view = new TView();
viewModel = new TViewModel();
view.DataContext = viewModel;
}
public void InitializeViewsAndViewModels(FrameworkElement[] views, object[] viewModels)
{
if (views.Length != viewModels.Length)
throw new ArgumentOutOfRangeException("views and viewModels must have the same number of elements.");
for (int i = 0; i < views.Length -1 ; i++)
InitializeViewAndViewModel(out views[i], out viewModels[i]);
}
}
The problem area is here
public void InitializeViewsAndViewModels(FrameworkElement[] views, object[] viewModels)
{
}
All these objects here that I pass in to the method remain null when the method returns.
InitializeViewsAndViewModels(new FrameworkElement[] { viewChatArea, viewUserArea, viewMessageArea, viewLoginPrompt },
new object[] { viewModelChatArea, viewModelUserArea, viewModelMessageArea, viewModelLoginPrompt });
I want to require passing all of the views and viewModels array objects as out, but I can only seem to require the entire array itself be passed as out.
What can I do here?
EDIT: The entire problem seems to stem from the Plural form of the method, as I described above. If I got rid of that and I simply did this…
public override void CreateViewsAndViewModels()
{
InitializeViewAndViewModel(out viewChatArea, out viewModelChatArea);
InitializeViewAndViewModel(out viewMessageArea, out viewModelMessageArea);
InitializeViewAndViewModel(out viewUserArea, out viewModelUserArea);
InitializeViewAndViewModel(out viewLoginPrompt, out viewModelLoginPrompt);
//InitializeViewsAndViewModels(new FrameworkElement[] { viewChatArea, viewUserArea, viewMessageArea, viewLoginPrompt },
// new object[] { viewModelChatArea, viewModelUserArea, viewModelMessageArea, viewModelLoginPrompt });
}
everything works just swimmingly.
You can’t have arrays of
outvalues in C#.Now what you are trying to do is very strange and even if arrays of
outwould be supported you will still endup with trobles – you are loosing types of variable in you arrays, so there is no reasoanble way to new them up correctly.Your current generic methods have multiple implementations in derived classes – one per pair of types (i.e. your
ChatControllerhave what you can view as 4 distinct implementation of InitializeViewAndViewModel each for specific pair of views). Your newly proposed code would have to find that missing type information somehow…