マルチプラットフォーム用に開発するにはPCL(ポータブル・クラス・ライブラリ)を使うと良いらしいのだが情報が少ない気がするので、調べたことをメモしていく

それにしてもどこかに.netでこう書いてるものをPCLで書くには・・・みたいな書籍とかサイトとか無いものか。現在はstack

基本事項

プロジェクト生成時にポータブルライブラリを選択すればPCLで開発出来るようになる。すでに.netのプロジェクトで開発している場合にPCLにする方法はシラン。

.netで使ってる機能で使えなくなるものが多い。ファイルアクセスなんかがSystem.IOに入ってなくて出来なくなるので、NugetでPCL関連のライブラリを調べるのは必須

参考:Xamarinと、ポータブル・クラス・ライブラリ(PCL) - Build Insider

ファイルアクセス

PCL Storageを使うとよしなにやってくれる。Nugetから入れれば使えるようになる。

使えなくなるメソッドが結構ある

例えばSystem.Type.GetPropertyでPropertyInfoを取得しようとしても、メソッド無いので無理。この場合はSystem.Refrectionを使う

using System.Refrection
...
PropertyInfo p = typeof(Hoge).GetRuntimeProperty("property");

いちいちこういうのがあるので、結構大変。

TypeよりはなるべくTypeInfoを使うのが良さげ

PCLだとType.IsClassとか無いけどTypeInfo.IsClassはある。

assembly.DefinedTypes
    .Where(x => x.IsClass && !x.IsAbstract && x.ImplementedInterfaces
        .Any(i => i.GetTypeInfo().IsGenericType && i.GetGenericTypeDefinition() == commandHandlerOpenGenericType))
    .Select(x => x.AsType())

みたいにして必要なインターフェースを持つクラスの型情報を取り出すとか出来る

参考:c# - Portable Class Library Reflection - Stack Overflow