シンプルなインターフェースがあるとしましょう:
public interface ISerialize
{
string FirstProp { get; set; }
string SecondProp { get; set; }
}
それはクラスによって実装されます:
public class Class1 : ISerialize
{
public string FirstProp { get; set; }
public string SecondProp { get; set; }
public string ThirdProp { get; set; }
}
public class Class2 : ISerialize
{
public string FirstProp { get; set; }
public string SecondProp { get; set; }
public string FourthProp { get; set; }
}
現時点では (これは長期的な安定性を意図したものではありません)、次のような Web ページがあります:
http://jsfiddle.net/SBbPT/ここで、各テキスト ボックスは Class1 または Class2 オブジェクトのプロパティに対応し、Add to batch
リンクはオブジェクトに JavaScript 配列を追加し、Submit batch
ボタンは JSON 文字列を文字列化されたオブジェクトの Web サービスに送信します。当分の間、次の JS がどのタイプClass1
またはClass2
作成されるかを決定します。
$(document).ready(function ()
{
var iSerialize = [];
$('#btnSubmit').click(function ()
{
//creates Class1 object if ThirdProp is present
if ($('#txt3').val().length > 0)
{
var class1 = { FirstProp: $('#txt1').val(), SecondProp: $('#txt2').val(), ThirdProp: $('#txt3').val() }
iSerialize.push(class1);
}
else
{
var class2 = { FirstProp: $('#txt1').val(), SecondProp: $('#txt2').val(), FourthProp: $('#txt4').val() };
iSerialize.push(class2);
}
$('input').val('');
});
$('#btnSubmitBatch').click(function ()
{
var data = "{jsonString:'" + JSON.stringify(iSerialize) + "'}";
console.log(data);
$.ajax(
{
type: "POST",
url: "default.aspx/DataList",
contentType: "application/json",
dataType: "json",
data: data,
success: function (data)
{
console.log('the post was successful');
console.log(data.d);
},
error: function (xhr)
{
console.log(xhr.status);
}
});
});
});
現在、ユーザーが FourthProp テキスト ボックスを空白のままにすると Class1 オブジェクトが作成され、ユーザーが ThirdProp テキスト ボックスを空白のままにすると Class2 オブジェクトが作成されます。現在の Web サービス メソッドは次のようになります。
[WebMethod]
public string DataList(string jsonString)
{
var jss = new JavaScriptSerializer();
List<ISerialize> list = jss.Deserialize<List<ISerialize>>(jsonString);
//some members might have different properties
//how to create a factory to create an instance based on the objects properties?
return list[0].FirstProp;
}
現在の状態ではエラーが発生します。No parameterless constructor defined for type of DeserializeListOfInterfaceTypes.ISerialize.
これは回避できList<ISerialize>
、具体的な型の 1 つのリストを作成することでプログラムが機能します。したがって、この場合、プロパティThirdProp
orの存在によってFourthProp
、オブジェクトがClass1
またはClass2
である必要があるかどうかがそれぞれ決定されます。JavaScript オブジェクトのプロパティを使用して、作成する C# オブジェクトを決定するにはどうすればよいですか?