假设有一个简单的界面:
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; }
}
目前(这并不意味着长期稳定)我有一个看起来像这样的网页: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>
列出其中一种具体类型来工作。所以在这种情况下,属性ThirdProp
or的存在分别FourthProp
确定了对象是否应该是Class1
or Class2
。如何使用 JavaScript 对象的属性来确定要创建的 C# 对象?