2012-09-05 5 views
0

매개 변수 배열의 모든 객체가 전달되도록 요구하려면 어떻게해야합니까? 내 다음 코드에서는 필자의 원래 매개 변수가 할당되지 않고 따라서 null이 아니기 때문에 실패하고 있음을 알고 있습니다. 비록 그들이 명시 적으로 그렇게 말할 필요없이 참조로서 전달된다고 생각 하겠지만, 그들은 그렇게 보이지 않습니다. 결과적으로 나는 그것을 out 매개 변수로 모두 전달해야했습니다.매개 변수 배열 객체를 외부로 전달

여기 내 코드에서 중요한 부분이 있습니다.

ChatController (제거 된 일부 요소)

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 (제거 된 일부 요소)

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]); 
    } 
} 

문제 영역 여기서 I는 전달 여기

public void InitializeViewsAndViewModels(FrameworkElement[] views, object[] viewModels) 
{ 
} 

이러한 모든 오브젝트 인 메서드가 반환 될 때 메서드에 null이 유지됩니다.

InitializeViewsAndViewModels(new FrameworkElement[] { viewChatArea, viewUserArea, viewMessageArea, viewLoginPrompt }, 
          new object[] { viewModelChatArea, viewModelUserArea, viewModelMessageArea, viewModelLoginPrompt }); 

은 내가 전망 및 배열로 밖으로 객체 viewModels을 모두 통과 필요 싶어하지만 난 단지 자체가 외부로 전달 될 전체 배열을 필요로 보일 수있다.

여기서 어떻게 할 수 있습니까?

편집 : 위에서 설명한 것처럼 전체 문제는 방법의 Plural 양식에서 비롯된 것 같습니다. 그걸 없애면 간단히 ...

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 }); 
} 

모든 것이 잘 작동합니다.

답변

2

C 배열에 out 배열을 가질 수 없습니다.

지금 당신은 무엇을하려고하는 것은 매우 이상하고 out의 배열이 지원 될 경우에도 당신은 여전히 ​​trobles와 endup 것이다 - 당신이 배열에 변수의 유형을 잃어버린, 그래서까지 그 새에 더 reasoanble 방법이 없습니다 바르게.

현재 일반적인 메소드는 파생 클래스에 여러 구현이 있습니다. 즉, 한 쌍의 유형 당 하나의 예 (즉, ChatController은 특정보기 쌍마다 각각 4 개의 InitializeViewAndViewModel 구현으로 볼 수 있습니다. 새로 제안 된 코드는 누락 된 유형 정보를 어떻게 든 찾아야 할 것입니다 ...

+0

을 대신 뷰와 ViewModels 당신이 주석 지역에서 볼처럼 각 쌍의 InitializeViewAndviewModel (단수) 메소드에 호출, 모든 작동합니다 . 복수형을 원하는 이유는 컨트롤러 클래스의 코드 양을 줄여서 모든 뷰/뷰 모델에 대한 x 번호 대신 한 줄로 처리 할 수있게하기 위해서입니다. 어떻게하면됩니까? 단 하나의 작품만으로도 충분합니다. 그렇다면 왜 복수 작품이 아니겠습니까? 결국, 그것은 유일한 방법을 부르고 있습니다. – Cowman

+0

@Cowman, 나는 단수의 메서드가 작동하는 이유를 설명하려고했는데 원하는 "복수형"단일 메서드로 변환 할 수는 없지만 그 점은 좋지 않다 ... generics에서 실제로 네 가지 논리적 메서드 현재 수업 시간에. 초기화에 관해서는 - 가장 쉬운 방법은 리플렉션을 사용하여 특정 기본 유형 (또는 특정 속성)의 모든 필드를 설정하는 것입니다. (MVC 컨트롤러 클래스를 구현하려는 경우) 실제로 수행하려는 작업이 더 나은 /보다 유용하게 사용할 수있는 실용적인 가치가 없음을주의하십시오. –

+0

나는 당신이 말하는 것을 완전히 분명히하지 못했다. 그러나 나는 그것의 요지를 다소 얻고 있다고 생각한다. 제네릭을 사용하여 내 다른 뷰와 뷰 모델을 만들고 초기화하는 제 생각은 나쁜 생각입니까? 이전에 새 코드를 작성하고 datacontext를 뷰에 할당 할 때 중복 된 코드를 피하는 데 도움이 되었기 때문에 좋았다고 생각했습니다. – Cowman

1

참조를 사용하십시오. 아래를 참조하십시오 : 나는 InitializeViewsAndViewModels (복수) 메소드를 제거하면

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 void CreateViewsAndViewModels() 
     { 
      //InitializeViewAndViewModel(out viewChatArea, out viewModelChatArea); 
      //InitializeViewAndViewModel(out viewMessageArea, out viewModelMessageArea); 
      //InitializeViewAndViewModel(out viewUserArea, out viewModelUserArea); 
      //InitializeViewAndViewModel(out viewLoginPrompt, out viewModelLoginPrompt); 
      var a = new FrameworkElement[] { viewChatArea }; 
      var b = new object[] { viewModelChatArea}; 
      InitializeViewsAndViewModels(a, 
             b); 
     } 
    } 

public abstract class ControllerBase 
    { 
     public void InitializeViewAndViewModel<TView, TViewModel>(ref TView view, ref 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; i++) 
       InitializeViewAndViewModel(ref views[i], ref viewModels[i]); 
     } 
    } 
+0

나는 이것을 시도했지만 동일한 결과가 있습니다. 모든 메소드 내에서는 뷰와 ViewModel이 각각의 형태로서 할당 할 수 있습니다. 나는 ... 방법 그러나 반환 ...이 일이 http://i.imgur.com/5GdBd.jpg 을 http://i.imgur.com/nAie8.jpg를 참조하십시오 그러나 기대 나는 문제가 있다고 생각한다. 실제로 그 중 하나를 제외한 모든 값을 정확하게 반환하고 있습니다 ... 이유를 알아낼 수 있는지 보겠습니다. – Cowman

+0

은 그 날 내 views.Length 제거하지 않았다 밝혀 - ... 당신을 반영하기 위해 1 을하지만 여전히 전망과 viewModels 올바른 표시되지만 실제 백업 필드 다음을 참조하십시오 ... 여전히 null의 HTTP : //i.imgur.com/WhF10.jpg 그래서 돌아가서 모든 필드를 배열의 적절한 요소에 수동으로 할당해야합니다. 왜 그런가요? 참조로 모두 전달하면 안됩니까? – Cowman