1

所以,我有一个非常简单的 C#/.Net 接口。现在,我需要将此接口公开给 WinRT。所以,目前我有这些接口

//.Net (in the `Common` namespace)
public interface IWriter
{
  void Write(string text);
}

//WinRT (in the `WinRT` namespace)
public interface IWriter
{
  void Write(string text);
}

虽然我可以做到IWriter : Common.IWriter,但显然这行不通,尽管使用了 WinRT 友好类型。所以,现在我正在编写一个实现两者的双向包装器:

//WinRT
internal class WriterWrapper : Common.IWriter, IWriter
{
  Common.IWriter CommonWriter;
  IWriter WinRTWriter;
  public WriterWrapper(IWriter writer)
  {
    WinRTWriter=writer;
  }
  public WriterWrapper(Common.IWriter writer)
  {
    CommonWriter=writer;
  }
  void Common.IWriter.Write(string text)
  {
    if(WinRTWriter == null)
    {
      CommonWriter.Write(text);
    }else{
      WinRTWriter.Write(text);
    }
  }
  void IWriter.Write(string text)
  {
    ((Common.IWriter)this).Write(text);
  }
}

这是相当丑陋和乏味的。此外,在我需要的地方使用它会导致“无限”对象图。

我需要这个接口,因为我有一个这样的 .Net 类:

//.Net (`Common` namespace)
public class Config
{
  public IWriter Writer{get;set;}
}

将此属性公开给 WinRT 的最佳猜测是包装此对象:

//WinRT
public class Config
{
  Common.Config CommonConfig;
  public Config()
  {
    CommonConfig=new Common.Config();
  }
  public IWriter Writer
  {
    get
    {
      return new WriterWrapper(CommonConfig.Writer);
    }
    set
    {
      CommonConfig.Writer=new WriterWrapper(value);
    }
  }
}

因此,对于某人对WinRT.Config.Writer新对象的每次访问,都会创建一个新对象,并且在 Config 对象超出范围之前永远不会被释放。

我怎样才能防止这种情况,有没有更好的方法来做到这一点?

4

0 回答 0