「手品」などはないようです。クラスを「昔ながらの方法」でシリアライズ/デシリアライズする必要があります。
興味がある場合は、次の解決策があります。
「ルート」インターフェイスを作成しました。この例では IModule です。この IModule には、Name というプロパティが 1 つだけ含まれています。これは文字列であり、便宜上のみ存在します。
この例の IFormChecker は、このインターフェイスから派生します。私のクライアントは、この Name プロパティの値と、もちろんインターフェイス自体を知っています。これで Name-value がサーバーに送信され、シリアル化されたクラスが返されます。
私がしなければならないことは次のとおりです。
var module = ModuleImplementations.FirstOrDefault(x => x.Name == name);
if(module == null) throw new SomeException();
return module.Serialize();
クライアントごとに、デシリアライズしてインターフェイスにキャストできます。それでおしまい。
ここに私の ModuleSerialization-Class があります:
public static class ModuleSerialization
{
public static string Serialize(this IModule m)
{
using (var ms = new MemoryStream())
{
var bf = new BinaryFormatter();
bf.Serialize(ms, m);
return Convert.ToBase64String(ms.ToArray());
}
}
public static T Deserialize<T>(string serialized) where T : class, IModule
{
var ba = Convert.FromBase64String(serialized);
using (var s = new MemoryStream(ba))
{
var bf = new BinaryFormatter();
return bf.Deserialize(s) as T;
}
}
}
乾杯!