このタスクに直面したときに私たちが最終的に何をしたかを共有したいと思います. OPのインターフェースとクラスを考えると...
public interface IThing
{
string Name { get; set; }
}
public class Thing : IThing
{
public int Id { get; set; }
public string Name { get; set; }
}
...インターフェイスの直接実装であるクラスを作成しました...
public class DirectThing : IThing
{
public string Name { get; set; }
}
次に、単にThing
インスタンスをシリアライズし、 としてデシリアライズしてから、 としてDirectThing
シリアライズしましたDirectThing
:
var thing = new Thing();
JsonConvert.SerializeObject(
JsonConvert.DeserializeObject<DirectThing>(JsonConvert.SerializeObject(thing)));
このアプローチは、長いインターフェイス継承チェーンで機能します...DirectThing
関心のあるレベルで直接クラス (この例では) を作成するだけです。反射や属性を気にする必要はありません。
メンテナンスの観点からは、メンバーを に追加すると、DirectThing
クラスのメンテナンスが容易になります。これは、メンバーも に追加しIThing
ていないとコンパイラーがエラーを出すためですDirectThing
。ただし、メンバー Xを削除して代わりIThing
に配置するThing
場合は、忘れずに削除する必要がありますDirectThing
。そうしないと、最終結果に X が含まれてしまいます。
パフォーマンスの観点から、ここでは 1 つではなく 3 つの (デ) シリアル化操作が行われているため、状況に応じて、リフレクター/属性ベースのソリューションとこのソリューションのパフォーマンスの違いを評価することをお勧めします。私の場合、これを小規模で行っていたので、数マイクロ/ミリ秒の潜在的な損失については心配していませんでした。
それが誰かを助けることを願っています!