0

パラメータ配列内のすべてのオブジェクトを out として渡すようにするにはどうすればよいですか? 次のコードでは、元のパラメーターが割り当てられず、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]);
    }
}

問題箇所はこちら

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

ここでメソッドに渡すこれらのオブジェクトはすべて、メソッドが返されたときに null のままです。

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

すべてのビューviewModels配列オブジェクトをアウトとして渡すことを要求したいのですが、配列自体全体をアウトとして渡すことしか要求できないようです。

ここで何ができますか?

EDIT:上で説明したように、問題全体はメソッドの複数形に起因しているようです。私がそれを取り除き、単にこれをやったとしたら...

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

すべてがスムーズに機能します。

4

2 に答える 2

2

outC# では値の配列を使用できません。

今、あなたがやろうとしていることは非常に奇妙で、たとえ配列outがサポートされていたとしても、それでも問題が発生します.配列内の変数の型を失っているので、それらを正しく新しくする合理的な方法はありません.

現在のジェネリック メソッドには、派生クラスに複数の実装があります。型のペアごとに 1 つです (つまり、ChatController特定のビューのペアごとに InitializeViewAndViewModel の 4 つの異なる実装として表示できるものがあります)。新しく提案されたコードは、欠落している型情報を何らかの方法で見つける必要があります...

于 2012-09-05T05:10:28.120 に答える
1

参照を使用してください。下記参照:

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]);
        }
    }
于 2012-09-05T05:36:51.787 に答える