C#3.0では、次の構文で匿名クラスを作成できます
var o1 = new { Id = 1, Name = "Foo" };
これらの匿名クラスを変数に動的に作成する方法はありますか?
例:
var o1 = new { Id = 1, Name = "Foo" };
var o2 = new { SQ = 2, Birth = DateTime.Now };
動的作成の例:
var o1 = DynamicNewAnonymous(new NameValuePair("Id", 1), new NameValuePair("Name", "Foo"));
var o2 = DynamicNewAnonymous(new NameValuePair("SQ", 2), new NameValuePair("Birth",
DateTime.Now));
私がする必要があるため:
dynamic o1 = new ExpandObject();
o1."ID" = 1; <--"ID" is dynamic name
o1."Name" = "Foo"; <--"Name" is dynamic name
そしてScene1:
void ShowPropertiesValue(object o)
{
Type oType = o.GetType();
foreach(var pi in oType.GetProperties())
{
Console.WriteLine("{0}={1}", pi.Name, pi.GetValue(o, null));
}
}
私が電話した場合:
dynamic o1 = new ExpandObject();
o1.Name = "123";
ShowPropertiesValue(o1);
結果を表示できません:
Name = 123
また、ExpandoObjectをAnonymouseTypeに変換する方法は?
Type type = o1.GetType();
type.GetProperties(); <--I hope it can get all property of o1
最後に、ShowPropertiesValue()メソッドを変更します
void ShowPropertiesValue(object o)
{
if( o is static object ) <--How to check it is dynamic or static object?
{
Type oType = o.GetType();
foreach(var pi in oType.GetProperties())
{
Console.WriteLine("{0}={1}", pi.Name, pi.GetValue(o, null));
}
}
else if( o is dynamic object ) <--How to check it is dynamic or static object?
{
foreach(var pi in ??? ) <--How to get common dynamic object's properties info ?
{
Console.WriteLine("{0}={1}", pi.Name, pi.GetValue(o, null));
}
}
}
DynamicNewAnonymousメソッドを実装する方法、またはShowPropertiesValue()を変更する方法
私の動機は次のとおりです。
dynamic o1 = new MyDynamic();
o1.Name = "abc";
Type o1Type = o1.GetType();
var props = o1Type.GetProperties(); <--I hope can get the Name Property
DynamicObjectのGetTypeメソッドをフックし、Compelが厳密に型指定されたTypeに変換できる場合。上記のシームレスなコードは正常に機能します。
匿名型は、暗黙的に宣言されている単なる通常の型です。 dynamic
とはほとんど関係ありません。
ExpandoObject を使用し、dynamic
変数を介して参照する場合、フィールドをその場で追加または削除できます。
編集
もちろんできます:IDictionary<string, object>
にキャストするだけです。その後、インデクサーを使用できます。
同じキャスト手法を使用して、フィールドを反復処理します。
dynamic employee = new ExpandoObject();
employee.Name = "John Smith";
employee.Age = 33;
foreach (var property in (IDictionary<string, object>)employee)
{
Console.WriteLine(property.Key + ": " + property.Value);
}
// This code example produces the following output:
// Name: John Smith
// Age: 33
上記のコードなどは、そのリンクをクリックして見つけることができます。
次のようなExpandoObjectを作成できます。
IDictionary<string,object> expando = new ExpandoObject();
expando["Name"] = value;
そして、動的にキャストした後、これらの値はプロパティのようになります。
dynamic d = expando;
Console.WriteLine(d.Name);
ただし、これらは実際のプロパティではなく、Reflectionを使用してアクセスすることはできません。したがって、次のステートメントはnullを返します。
d.GetType().GetProperty("Name")