0

実行時に型のプロパティを作成することは可能ですか? 私のタイプ「アカウント」には、「ID」や「アカウント名」などの事前定義された一連のプロパティがあり、INotifyPropertyChanged を実装しています。実行時にこのタイプにプロパティを追加したかったので、ゲッターとセッター、およびセッターはメソッドを呼び出しますそのプロパティ名を渡して通知する

public string Name
{
     get { return _name; }
     set
     {
          _name = value;
          NotifyPropertyChanged("Name");
     }
}
4

4 に答える 4

1

を使用Reflection.Emitして、クラスから継承する新しいクラスを動的に作成し、その新しい型にプロパティを追加できます。独自の型を継承しているため、その型の「拡張」と見なすことができます。

この道のりは複雑であり、仕事を終えた後に二度と理解できないコードを生成する可能性があることを警告しなければなりません!

また、MSIL コードがどのように機能するかについても理解できます。それは少し奇妙で、反転したものです。C# などの言語で期待するのとはまったく逆の方法で行う必要があります。スタックから値をプッシュおよびポップして関数に引数として渡す必要があり、関数からの未使用の戻り値を積極的に破棄する必要があります...など。

はい、私はあなたにこれを恐れさせようとしています...それはとても苦痛な方法です;)

これに陥る前に、他の選択肢を検討してください。

SOには、この問題についてすでに多くの資料があります: https://stackoverflow.com/questions/tagged/reflection.emit

Reflection.Emit を説明する CodeProject の記事: Reflection.Emit を使用した動的型

于 2012-09-19T20:30:49.783 に答える
1

はい。ただし、「通常の」CLRタイプではありません。あなたはそれを達成することができます、実際にはそのタイプは特にそのような機能のために作成されました: DynamicObject

を実装 するクラスのサンプルコードを見てくださいDynamicObject

public class DynamicDictionary : DynamicObject
{
   ...
}

そして、次のように使用できるようになったら:

dynamic person = new DynamicDictionary();

// Adding new dynamic properties.      
person.FirstName = "Ellen";
person.LastName = "Adams";
于 2012-09-19T19:31:10.573 に答える
0

動的オブジェクトを使用するか、拡張メソッドを介して動作を拡張します。私は他のオプションを知りません。

于 2012-09-19T19:32:26.333 に答える
-1

いいえ、それは C# オブジェクトでは不可能です

DynamicObjectを使用した質問のように、さまざまなプロパティを格納できるクラスのような辞書を作成できます

できることは、リフレクションによって新しいクラス タイプを作成することであり、新しいプロパティを含めることができます。しかし、これらに簡単にアクセスする方法はありません

于 2012-09-19T19:33:10.353 に答える