所以,我有一个非常简单的 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 对象超出范围之前永远不会被释放。
我怎样才能防止这种情况,有没有更好的方法来做到这一点?