このタスクに直面したときに私たちが最終的に何をしたかを共有したいと思います. 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 つの (デ) シリアル化操作が行われているため、状況に応じて、リフレクター/属性ベースのソリューションとこのソリューションのパフォーマンスの違いを評価することをお勧めします。私の場合、これを小規模で行っていたので、数マイクロ/ミリ秒の潜在的な損失については心配していませんでした。
それが誰かを助けることを願っています!