15

と の関係を、両方の必要性という点で理解してHttpPostedFileBaseHttpPostedFileWrapperます (つまり、単体テスト/モックで)。しかし、 の戻り値にブレークポイントを設定するとHttpPostedFileBase、 と表示されるのはHttpPostedFileWrapperなぜですか?

さらに、HttpPostedFileBaseContentType プロパティを実装しません。では、コードが のみを参照HttpPostedFileBaseし、 を参照しないのに、なぜ値を返すのHttpPostedFileWrapperでしょうか? これはどんなトリックですか?

ここに画像の説明を入力

編集#1:

@lawliet29 さん、すばらしい返信ありがとうございます。私は提案された構造を書き出しました。

public sealed class MyHttpPostedFile
{
    public string ContentType { get { return "123"; } }
}

public abstract class MyHttpPostedFileBase
{
}

public class MyHttpPostedFileWrapper : MyHttpPostedFileBase
{
    private MyHttpPostedFile _myHttpPostedFile;    

    public MyHttpPostedFileWrapper(MyHttpPostedFile myHttpPostedFile) { 
        _myHttpPostedFile = myHttpPostedFile;
    }

    public string ContentType { get { return _myHttpPostedFile.ContentType; } }
}

ただし、これが機能するためには、次のようにパラメーターを渡す必要があります。

GetFiles(new MyHttpPostedFileWrapper(new MyHttpPostedFile());

これは、私が疑問に思っているトリックが存在する場所のようです。.NET は、渡されるバイトが型のクラスでMyHttpPostedFileあること、およびそのオブジェクトを受け取り、コンストラクターにパラメーターとして渡す必要があることをどのように認識しますか?

編集#2:

ASP.NET MVC バインダーが、これらのより高いレベルのオブジェクトを渡すことによってバイトを渡す以上のことを行うことに気付きませんでした。気になっていた裏ワザはこれ!素晴らしい反応をありがとう。

4

1 に答える 1