プラットフォーム依存のC#コード
C#のコードをプラットフォームごとに切り分けるには、#ifディレクティブを使う方法と、パーシャルクラスを使う方法とがあります。
プラットフォームごとのシンボルは、次のように定義されています。
- UWP:NETFX_CORE
- Android:__ANDROID__
- iOS:__IOS__
- WebAssembly:__WASM__
「.Shared」プロジェクトの中では、上記のシンボルを使って#ifディレクティブで分岐できます。例えば、MainPageクラスに定義したメンバー変数Platformを、次のコードのようにしてプラットフォームごとに異なった値に初期化できます。なお、このメンバー変数Platformは、後ほどお見せする実行例でTextBlockにバインドしています。
public sealed partial class MainPage : Page
{
string Platform
#if NETFX_CORE
= "UWP";
#elif __ANDROID__
= "Android";
#elif __IOS__
= "iOS";
#elif __WASM__
= "WebAssembly";
#endif
プラットフォーム依存コードが何行にも渡る長いものであった場合、#ifディレクティブではコードの見通しが悪くなります。そのようなときはパーシャルクラスを利用します。
例えば、「.Shared」プロジェクトに、次のコードのようにSampleMessageクラスを作ったとします。このクラスはまだ不完全で、文字列定数PlatformNameの定義を追加する必要があります。
internal partial class SampleMessage
{
internal static string GetString()
=> string.Format($"このプラットフォームは{PlatformName}です。");
}
次に、プロジェクトごとにパーシャルクラスのファイルを作って、そこに文字列定数PlatformNameの定義を記述します。ファイル名は「.Shared」プロジェクトに置いたファイルと同じでも構わないのですが、区別しやすいように違う名前にしておきます。例えば、「.iOS」プロジェクトに置くファイル名は「SampleMessage.iOS.cs」などとするとよいでしょう。
「.iOS」プロジェクト用に文字列定数PlatformNameを定義したパーシャルクラスを、次のコードに示します。残りの3プロジェクトにも同様に作成し、それぞれの文字列定数を定義します。
internal partial class SampleMessage
{
const string PlatformName = "iOS";
}
次の画像に実行例を示します。画面上方の色付き文字列のプラットフォーム名は、前述の#ifディレクティブによるもの。ボタンの下にある文字列は、パーシャルクラスのメソッドを呼び出したものです。
なお、実際の開発では、この程度の文字列の使い分けならプロジェクトごとに文字列リソース(「Resources.resw」ファイル)を置くだけで済みます。上記のコードは、あくまでも説明用のサンプルということでご容赦ください。
