【问题标题】:Xaml serialization and immutable structs?Xaml 序列化和不可变结构?
【发布时间】:2009-09-18 21:12:22
【问题描述】:

我该怎么做?

尝试使用 TypeConverter,但我唯一能想到的就是为类型构造 XML,这并没有完全消除它。 xaml 序列化中的 TypeConverters 将转义 xml 并将其视为纯文本。价值转换器也好不到哪里去。

现在,我正在转向 ISupportInitialize,如果在初始化后进行了更改,我会抛出异常,但我希望使用不可变路由...


我希望序列化的类型示例:

public struct Foo
{
  public string Bar {get;private set;}
  public Foo(string bar) : this()
  {
    Bar = bar;
  }
}

和代码

var foo = new Foo("lol");
var serializedFoo = XamlWriter.Save(foo);

【问题讨论】:

  • 如果你能展示一些代码来理解你想要做什么会有所帮助

标签: c# .net struct immutability xaml-serialization


【解决方案1】:

抱歉,您不能在 XAML 2006 中对不可变对象使用正常的序列化。

使用支持构造函数和工厂方法的 XAML 2009,您应该能够实现您的目标。请注意,WPF 4 不会使用 XAML 2009。

【讨论】:

    【解决方案2】:

    哇!我完全误读了这个问题...
    ==================================

    尝试使用标记扩展来创建不可变结构:

    public class FooExtension : MarkupExtension
    {
      public string Bar {get; set;}
    
      public ImgPathExtension(string bar)
      {
        this.Bar = bar;
      }
    
      public override object ProvideValue(IServiceProvider serviceProvider)
      {
        var foo = new Foo(this.Bar);
        return foo;
      }
    }
    

    现在,您可以在 XAML 中使用扩展语法:{ext:Foo Bar="lol"}

    只需像使用任何其他 MarkupExtension 一样使用它,例如 Binding、DynamicResource 等。

    如果您需要更多详细信息,请参阅this link

    HTH,

    查尔斯

    【讨论】:

    • 这个可以在反序列化手写XAML的时候使用,但是XAMLserialization(即XamlWriter.Save)不知道怎么用这个。
    • 是的,我刚刚意识到我的错误...抱歉。
    猜你喜欢
    • 2019-10-08
    • 2012-11-13
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    • 2012-07-18
    相关资源
    最近更新 更多