コードを参照してください:理解TypeDescriptor /のPropertyDescriptorの/ etc
class DataItem
{
public DataItem(int num, string s)
{
Number = num;
Str = s;
}
public int Number { get; set; }
public string Str { get; set; }
}
static void Main(string[] args)
{
var data = new DataItem(2, "hi");
var provider = TypeDescriptor.AddAttributes(typeof(DataItem),
new SerializableAttribute());
var another = provider.CreateInstance(null, typeof(DataItem),
new Type[] { typeof(int), typeof(string) },
new object[] { 100, "hello" }) as DataItem;
var newProperty = TypeDescriptor.CreateProperty(another.GetType(), "Str",
typeof(string),
new DescriptionAttribute("new property"));
//newProperty.SetValue(another, "new one");
Console.WriteLine(newProperty.GetValue(another));
Console.Read();
}
を私はコードのためにいくつかの質問を持っている:
(1)私は、「これが何であるか、のDataItemのタイプにSerializableAttribute
を追加しました変更 "が適用されますか? typeof(DataItem).GetCustomAttributes(true)
でこの属性を取得できません。 "重要なDataItem"に変更が適用されていないようです。一時的にTypeDescriptionProviderに格納されていますか?
(2)インスタンスanother
は、プロバイダ(ここでは属性を追加した場所)によって作成されますが、この変数はSerializableAttributed DataItemのコンストラクタで作成された変数と同じになると思いますか? another.GetType().GetCustomAttributes
で属性を取得できない場合でも、
(3)私は変更が一時的にプロバイダに保存されていると考えているもう一つの理由は、私が実際にすでにDataItem
に存在し、その名前Str
とタイプstring
、とプロパティを作成しようとしたことです。コードはhello
を出力します。 SetValue
メソッドのコメントを外すと、出力はnew one
になります。何か誤解はありますか?
私は自分の質問を編集しました。私はこの質問で同じであると思います。 –
OK、この場合は1)、TypeDescriptor.GetAttributes(typeof(DataItem))はSerializableAttributeを返します。 System.Typeは、実際にはアセンブリからロードされたメタデータを参照します。動的なカスタム型の場合、TypeDescriptorは参照(および関連するプロバイダ)になります。 –