如果您的API需要靜態方法,那麼只需將靜態方法添加到您的引用程序集中即可。
引用程序集可能沒有實現,所以它只是定義類型,或者它可能包含實現邏輯。
如果您需要特定於平臺的邏輯,並且仍然希望在您的參考裝配中使用靜態實現,那麼這是可能的。一個例子是PCLStorage NuGet package。這有一個靜態FileSystem類,它有一個名爲Current的靜態屬性。
public static class FileSystem
{
static Lazy<IFileSystem> _fileSystem = new Lazy<IFileSystem>(() => CreateFileSystem(), System.Threading.LazyThreadSafetyMode.PublicationOnly);
public static IFileSystem Current
{
get
{
IFileSystem ret = _fileSystem.Value;
if (ret == null)
{
throw new NotImplementedException();
}
return ret;
}
}
static IFileSystem CreateFileSystem()
{
return null;
}
}
所以大家參考組件可以定義一個靜態類和靜態屬性,甚至是一個靜態方法,它沒有實現。 PCLStorage的FileSystem類在其引用程序集中具有私有靜態CreateFileSystem方法:
然後,在您的平臺特定程序集中,您的CreateFileSystem創建自己的類,該類實現IFileSystem接口。在你的情況下,靜態方法可以是公開的而不是私有的。
的PCLStorage項目採用有條件地定義代碼來創建不同的特定平臺和參考組件:
static IFileSystem CreateFileSystem()
{
#if NETFX_CORE || WINDOWS_PHONE
return new WinRTFileSystem();
#elif SILVERLIGHT
return new IsoStoreFileSystem();
#elif FILE_SYSTEM
return new DesktopFileSystem();
#else
return null;
#endif
}
這一切工作,如果所有的名字和你的組件的版本是所有平臺一樣的,包括參考組件。這是Paul Betts在Bait and Switch PCL trick的帖子中討論的bait and switch trick。在Paul Betts的例子中,一個可移植類庫(PCL)被用作一個引用程序集,他展示了另一種非常類似的方法來在引用程序集類中使用靜態方法,並在另一個程序集中使用特定於平臺的實現。
那麼,這是難題。由於我的引用程序集不能有任何實現,它必須是一個接口或抽象類,我不能將一個靜態方法添加到接口或抽象類 – Srik
如果需要,您的引用程序集可以有實現。 –
我被限制在參考庫中沒有實現,因爲我的庫不是AnyCPU - 它們對於x86,ARM和x64是不同的。 – Srik