DynamicObjectのドキュメントには、DynamicDictionary
の例があります。この例では、プロパティを持つクラスであるかのように辞書を扱うことができます。ここでオブジェクト初期化子をサポートするカスタムDynamicObjectクラスを書く方法
は(簡潔にするためにわずかに変更された)クラスである:私がやりたいのは何
public class DynamicDictionary : DynamicObject
{
Dictionary<string, object> _dictionary = new Dictionary<string, object>();
public int Count
{
get { return _dictionary.Count; }
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
string name = binder.Name.ToLower();
return _dictionary.TryGetValue(name, out result);
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
_dictionary[binder.Name.ToLower()] = value;
return true;
}
}
は、私は次の操作を行うことができるように、クラスを変更です:
public class Test
{
public Test()
{
var result = Enumerable.Range(1, 5).Select(i => new DynamicDictionary
{
Id = i,
Foo = "Foo",
Bar = 2
});
}
}
質問
- これは可能ですか?
- はいの場合、どうですか?
オブジェクトイニシャライザはダイナミックオブジェクトでは機能しません – Magnus
@Magnusは技術的にはダイナミックオブジェクトで動作しますが、ダイナミックではありません。したがって、あなたの動的オブジェクトが非動的な 'Id'プロパティを持っている場合は、オブジェクト初期化子を使用することができます。しかし、これは質問に答えるのに役立つものではありません。 – svick
True、 "normal"プロパティの場合はうまく動作します。私はあなたが 'IEnumerable>'を取り、それを使ってディクショナリを作成するコンストラクタを追加すると思います。 –
Magnus