と の関係を、両方の必要性という点で理解してHttpPostedFileBase
いHttpPostedFileWrapper
ます (つまり、単体テスト/モックで)。しかし、 の戻り値にブレークポイントを設定するとHttpPostedFileBase
、 と表示されるのはHttpPostedFileWrapper
なぜですか?
さらに、HttpPostedFileBase
ContentType プロパティを実装しません。では、コードが のみを参照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 バインダーが、これらのより高いレベルのオブジェクトを渡すことによってバイトを渡す以上のことを行うことに気付きませんでした。気になっていた裏ワザはこれ!素晴らしい反応をありがとう。