56

厳密に型指定されたオブジェクトの構造と正確に一致する動的オブジェクトまたは匿名オブジェクトがある場合、動的オブジェクトから型指定されたオブジェクトを構築する .NET メソッドはありますか?

LINQdynamicList.Select(dynamic => new Typed { .... }タイプのものを使用できること、または Automapper を使用できることはわかっていますが、このために特別に構築されたものがないかどうか疑問に思っています。

4

5 に答える 5

65

その後すぐに逆シリアル化するために、中間形式にシリアル化できます。これは最もエレガントで効率的な方法ではありませんが、あなたの仕事を成し遂げるかもしれません:

これがあなたのクラスだとします:

// Typed definition
class C
{
    public string A;
    public int B;
}

そして、これはあなたの匿名インスタンスです:

// Untyped instance
var anonymous = new {
    A = "Some text",
    B = 666
};

匿名バージョンを中間形式にシリアル化してから、型付きバージョンに再度逆シリアル化できます。

var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
var json = serializer.Serialize(anonymous);
var c = serializer.Deserialize<C>(json);

これは、ラウンドトリップが対称的である限り、理論的には任意のシリアライザー/デシリアライザー ( XmlSerializer、バイナリ シリアライゼーション、その他の json ライブラリ) で可能であることに注意してください。

于 2013-06-26T14:05:10.353 に答える
18

あなたの質問は、静的に型付けされた変数を別の静的に型付けされた変数 (異なる継承チェーンから)に変換できますか? 答えは明らかにNoです。

なぜあなたの質問は上記の質問に行き着くのですか?

  • 動的な型の使用は、リフレクションで Object 型を使用するようにコンパイルされます。
  • あなたのコードは、実際にはオブジェクトを受け取ります。これには、(実際には) 1 つの特定の静的型からの値が含まれます。

したがって、実際には、コードは静的に型指定された値を処理し、オブジェクトに割り当てられ、コンパイル時に動的として扱われます。したがって、静的に型指定された値を [リフレクションなしで] 別の値に変換できる唯一のケースは、それらが同じ継承チェーンの一部である場合です。それ以外の場合は、リフレクションを明示的に (ユーザーが作成) または暗黙的に (MS が動的に使用して作成) 使用する必要があります。

つまり、次のコードは、動的に割り当てられた値が Person から派生したものであるか、Person 自体である場合にのみ実行時に機能します(そうでない場合、Person へのキャストはエラーをスローします)。

dynamic dPerson = GetDynamicPerson();
Person thePerson = (Person)dPerson;

それだけです。

言うまでもなく、(C++ のように) メモリ アドレスにアクセスする安全でないコードを使用して値をバイト単位でコピーできますが、それはリフレクションに勝るものはありません。

于 2013-06-25T16:47:00.937 に答える
0

したがって、プリミティブ変数を手動で設定することを前提として、この質問に対する回答を提供します。Dictionary<string, dynamic> dictとの動的バージョンを含む があるとfloat xbool yます。できるよ:

float x = (float)dict["x"];
bool y = (bool)dict["y"];

参照型に対してこれを行いたい場合は、すべてのフィールドに対してこの変換を行うクラスのコンストラクターを用意するだけです。

于 2022-02-17T18:55:36.580 に答える