C# 高层Api,未使用RestSharp发布主题数据
我正在尝试使用with,以便将一个新人连同他们输入的任何自定义数据一起发布到我们的Highrise帐户 我遇到的问题是自定义数据。person对象发布得很好,但是主题数据字段没有包含在帖子中 我确实看到了这个帖子:。看起来缺少的是C# 高层Api,未使用RestSharp发布主题数据,c#,restsharp,highrise,C#,Restsharp,Highrise,我正在尝试使用with,以便将一个新人连同他们输入的任何自定义数据一起发布到我们的Highrise帐户 我遇到的问题是自定义数据。person对象发布得很好,但是主题数据字段没有包含在帖子中 我确实看到了这个帖子:。看起来缺少的是subject\u data字段中的type=“array”属性。我通过使用我试图发布的对象的序列化值手动创建请求来测试这个假设。此测试的结果是成功地向服务器发布了所有自定义数据字段 我曾尝试从包装程序集中扩展类,以将缺少的属性添加到列表中,但这似乎仍然不起作用。Per
subject\u data
字段中的type=“array”
属性。我通过使用我试图发布的对象的序列化值手动创建请求来测试这个假设。此测试的结果是成功地向服务器发布了所有自定义数据字段
我曾尝试从包装程序集中扩展类,以将缺少的属性添加到列表中,但这似乎仍然不起作用。Person对象有一个SubjectData对象列表的属性,我在子类中重写了该属性以使用自定义类。通过这种方式,我可以添加一个属性用作属性。这个自定义类似乎仍然不起作用
在查看了的代码之后,它似乎只会在该对象实现IList时添加项目列表。这不是一个问题,我能够让它工作,但代码似乎不允许向列表元素添加属性。它只查看list类的子类,并忽略对象上的任何其他属性
所以我的问题是:
是否可以将属性应用于RestSharp中的列表属性,或者是否有其他方法添加
type=“array”在发送请求之前,数据主题
xml节点的
属性?我最终通过创建一个新的请求类解决了这个问题,该类将使用自定义XmlSerializer创建一个RestRequest
然后我扩展了Person类并将该属性隐藏在自定义列表对象属性后面
之前:
[SerializeAs(Name = "subject_datas")]
public List<SubjectData> SubjectDatas { get; set; }
[SerializeAs(Name = "subject_datas")]
public new SubjectDataList SubjectDatas { get; set; }
SubjectDataList
类只是List
的包装器
SubjectDataList
实现一个名为ISerializeList
定义为:
interface ISerializeList : IEnumerable {}
interface ISerializeList<T> :IEnumerable<T>, ISerializeList {}
private void ProcessIList(IList list, XElement element) {
ProcessIEnumerable(list, element);
}
private void ProcessISerializeList(ISerializeList list, XElement element) {
ProcessIEnumerable(list, element);
Map(element, list);
}
private void ProcessIEnumerable(IEnumerable list, XElement element) {
var itemTypeName = "";
foreach (var item in list) {
if (itemTypeName == "") {
var type = item.GetType();
var setting = type.GetAttribute<SerializeAsAttribute>();
itemTypeName = setting != null && setting.Name.HasValue() ? setting.Name : type.Name;
}
var instance = new XElement(itemTypeName.AsNamespaced(Namespace));
Map(instance, item);
element.Add(instance);
}
}
然后我创建了一个名为XmlListSerializer
的类,它实现了ISerializer
。我复制了XmlSerializer的实现,但做了一些修改。在Map
方法中,有一部分检查变量rawValue
是否为IList
。我稍微修改了这一部分,并为我的XmlListSerializer
类添加了一个子句
现在看起来是这样的:
if (propType.IsPrimitive || propType.IsValueType || propType == typeof(string)) {
//...
} else if (rawValue is IList) {
ProcessIList((IList) rawValue, element);
} else if (rawValue is ISerializeList) {
ProcessISerializeList((ISerializeList) rawValue, element);
} else {
Map(element, rawValue);
}
其中ProcessIList
和processiseralizelist
定义为:
interface ISerializeList : IEnumerable {}
interface ISerializeList<T> :IEnumerable<T>, ISerializeList {}
private void ProcessIList(IList list, XElement element) {
ProcessIEnumerable(list, element);
}
private void ProcessISerializeList(ISerializeList list, XElement element) {
ProcessIEnumerable(list, element);
Map(element, list);
}
private void ProcessIEnumerable(IEnumerable list, XElement element) {
var itemTypeName = "";
foreach (var item in list) {
if (itemTypeName == "") {
var type = item.GetType();
var setting = type.GetAttribute<SerializeAsAttribute>();
itemTypeName = setting != null && setting.Name.HasValue() ? setting.Name : type.Name;
}
var instance = new XElement(itemTypeName.AsNamespaced(Namespace));
Map(instance, item);
element.Add(instance);
}
}
private void ProcessIList(IList列表,XElement元素){
ProcessIEnumerable(列表、元素);
}
私有void processiseralizelist(iseralizelist列表,XElement元素){
ProcessIEnumerable(列表、元素);
地图(元素、列表);
}
私有void ProcessIEnumerable(IEnumerable列表,XElement元素){
var itemTypeName=“”;
foreach(列表中的变量项){
如果(itemTypeName==“”){
var type=item.GetType();
var setting=type.GetAttribute();
itemTypeName=setting!=null&&setting.Name.HasValue()?setting.Name:type.Name;
}
var instance=new-XElement(itemTypeName.AsNamespaced(Namespace));
地图(实例、项目);
元素。添加(实例);
}
}
我希望这个答案能够帮助其他有问题的人