C# 如何制作一个可以添加到窗口中的类。

C# 如何制作一个可以添加到窗口中的类。,c#,uwp,C#,Uwp,我正在制作一个UWP应用程序,它利用AppServiceConnection向COM风格的应用程序发送数据。 AppService EnnEng.sDeMeGasActhyCy]()/代码>采用一种类型的代码> Windows .Fun.Posial.ValueSeS/ < /P> ValueSet类是一个集合,类似于存储类型的KeyValuePairs的字典 向值集中添加数据时遇到问题,每次尝试添加对象时都会收到错误:“不支持此类型的数据。(HRESULT的异常:0x8007065E)” 对这

我正在制作一个UWP应用程序,它利用
AppServiceConnection
向COM风格的应用程序发送数据。<代码> AppService EnnEng.sDeMeGasActhyCy]()/代码>采用一种类型的代码> Windows .Fun.Posial.ValueSeS/<代码> < /P> ValueSet类是一个集合,类似于存储类型的KeyValuePairs的字典

向值集中添加数据时遇到问题,每次尝试添加对象时都会收到错误:“不支持此类型的数据。(HRESULT的异常:0x8007065E)”

对这个错误的研究表明,要添加的对象必须是可序列化的类型,并且可以实现<代码> Windows .Fun.Posial.IfPrimeTys,这本身就是一个集合接口,它似乎存储了KealValueAsv.</P> 我想知道如何创建一个可以添加到值集的类。我是否必须创建一个实现

IPropertySet
的新集合,或者是否有某种方法使类本身可序列化并能够添加到值集

如果我必须实现
IPropertySet
,有人能告诉我如何实现这一点的详细文档吗

WinRT没有可序列化对象的概念;它只支持值类型,如整数、布尔、字符串、数组、日期时间等,以及这些类型的集合。查看的静态
Create*
成员作为示例(尽管您不需要使用这些方法来创建放入集合中的项)

如果要序列化WinRT对象或自己的.NET对象,可以将其转换为JSON或XML,然后将其放入
值集中

例如:

  public void TestValueSet()
  {
    var x = new ValueSet();

    // Integers are OK
    x.Add("a", 42);

    // URIs are not OK - can't be serialized
    try
    {
      x.Add("b", new Uri("http://bing.com"));
    }
    catch (Exception ex)
    {
      Debug.WriteLine("Can't serialize a URI - " + ex.Message);
    }

    // Custom classes are not OK
    var myClass = new MyClass { X = 42, Y = "hello" };
    try
    {
      x.Add("c", myClass);
    }
    catch (Exception ex)
    {
      Debug.WriteLine("Can't serialize custom class - " + ex.Message);
    }

    // Serialized classes are OK
    x.Add("d", Serialize<MyClass>(myClass));

    foreach (var kp in x)
    {
      Debug.WriteLine("{0} -> {1}", kp.Key, kp.Value);
    }
  }

  string Serialize<T>(T value)
  {
    var dcs = new DataContractSerializer(typeof(T));
    var stream = new MemoryStream();
    dcs.WriteObject(stream, value);
    stream.Position = 0;
    var buffer = new byte[stream.Length];
    stream.Read(buffer, 0, (int)stream.Length);
    return Encoding.UTF8.GetString(buffer);
  }
}

[DataContract]
public class MyClass
{
  [DataMember]
  public int X { get; set; }
  [DataMember]
  public string Y { get; set; }
}
public void TestValueSet()
{
var x=新的值集();
//整数是可以的
x、 添加(“a”,42);
//URI不正常-无法序列化
尝试
{
x、 添加(“b”,新Uri(“http://bing.com"));
}
捕获(例外情况除外)
{
WriteLine(“无法序列化URI-”+ex.Message);
}
//自定义类不正常
var myClass=newmyclass{X=42,Y=“hello”};
尝试
{
x、 添加(“c”,myClass);
}
捕获(例外情况除外)
{
WriteLine(“无法序列化自定义类-”+ex.Message);
}
//序列化类没有问题
x、 添加(“d”,序列化(myClass));
foreach(x中的var kp)
{
Debug.WriteLine(“{0}->{1}”,kp.Key,kp.Value);
}
}
字符串序列化(T值)
{
var dcs=新的DataContractSerializer(typeof(T));
var stream=newmemoryStream();
dcs.WriteObject(流、值);
流位置=0;
var buffer=新字节[stream.Length];
读取(缓冲区,0,(int)stream.Length);
返回Encoding.UTF8.GetString(缓冲区);
}
}
[数据合同]
公共类MyClass
{
[数据成员]
公共整数X{get;set;}
[数据成员]
公共字符串Y{get;set;}
}

这确实满足了我的序列化需求。如何反序列化返回的字符串?取决于序列化数据的方式;在本例中,您将使用
DataContractSerializer.ReadObject
——这是一个完整的示例。请注意,许多人更喜欢使用Json.NET进行序列化,但我希望我的答案是独立的。@PeterTorr MSFT可以放入
值集中的WinRT类型的完整列表是什么?基本上都是简单的值类型--除了
IInspectable
(ie类)之外,任何可以创建为。