Допустим, что есть простой интерфейс:Создать список типов интерфейсов из массива JavaScript
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
отправляет J SON для веб-службы строкового объекта. На данный момент следующего 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. Мой текущий метод веб-службы выглядит следующим образом:
[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
или FourthProp
определяет, должен ли объект быть Class1
или Class2
, соответственно. Как я могу использовать свойства объекта JavaScript для определения того, какой объект C# создать?