尝试将两种不同的类型映射到一个值 [英] Trying to map two different types to one value
本文介绍了尝试将两种不同的类型映射到一个值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个 DataMember
,需要用api json字符串填充...
I have a DataMember
that I need to be filled in by an api json string...
[DataContract]
public class Values
{
[DataMember]
public object value { get; set; }
}
API json字符串:
[
{
"type": "text",
"values": [
{
"value": "Text that is in textfield"
}
]
},
{
"type": "category",
"values": [
{
"value": {
"text": "Category title",
"color": "#000000"
}
}
]
}
]
我将此字符串映射到一个强类型对象 Field
,如下所示:
I map this string to a strong typed object Field
like so:
private List<Field> PrepFieldObject(string response)
{
using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(response)))
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(List<Field>));
return (List<Field>)serializer.ReadObject(stream);
}
}
但是当它映射到 Values.value
,它发出嘶嘶声……我试图这样解决:
but when it gets to mapping Values.value
, it throws a hissy fit... I tried solving it like this:
[DataContract]
public class Values
{
[DataMember]
public object value
{
get {
return xamlValue;
}
set
{
xamlValue = new Value();
if( value is string )
{
xamlValue.text = (string)value; // This works fine
}
else
{
Value theValue = value as Value;
try
{
xamlValue.text = theValue.text; // Can't get hold of .text even though it does exist in the json.
xamlValue.color = theValue.color;
}
catch (Exception e)
{
}
}
}
}
public Value xamlValue { get; set; }
}
[DataContract]
public class Value
{
[DataMember]
public string text { get; set; }
[DataMember]
public string color { get; set; }
}
但是它不允许我访问对象的属性(我想是因为它们从未被DataContract映射)
我尝试添加
[KnownType(typeof(Value))]
[KnownType(typeof(string))]
但这也无济于事:'(
推荐答案
我认为您可以使用反射来访问对象的属性值
尝试将设置者的else部分更改为
I think you can use reflection to to access your object's property value. Try changing your setter's else part as
else
{
Value theValue = value as Value;
try
{
// pass the object and the property name you're trying to get hold of
xamlValue.text = PropertyHasValue(theValue, "text"); // Can't get hold of .text even though it does exist in the json.
xamlValue.color = PropertyHasValue(theValue, "color");
}
catch (Exception e)
{
}
}
以及反射方法
// using reflection to get the object's property value
public static String PropertyHasValue(object obj, string propertyName)
{
try
{
if (obj != null)
{
PropertyInfo prop = obj.GetType().GetProperty(propertyName, BindingFlags.Instance | BindingFlags.Public);
if (prop != null)
{
string sVal = String.Empty;
object val = prop.GetValue(obj, null);
if (prop.PropertyType != typeof(System.DateTime?))
sVal = Convert.ToString(val);
else // format the date to contain only the date portion of it
sVal = Convert.ToDateTime(val).Date.ToString("d"); ;
if (sVal != null)
{
return sVal;
}
}
}
return null;
}
catch
{
return null;
}
}
这篇关于尝试将两种不同的类型映射到一个值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文