ディクショナリ内のすべてのエントリが既知のタイプである DynamicDictionary の実装があります。
public class FooClass
{
public void SomeMethod()
{
}
}
dynamic dictionary = new DynamicDictionary<FooClass>();
dictionary.foo = new FooClass();
dictionary.foo2 = new FooClass();
dictionary.foo3 = DateTime.Now; <--throws exception since DateTime is not FooClass
私が望むのは、辞書エントリの 1 つのメソッドを参照するときに Visual Studio Intellisense を機能させることです。
dictionary.foo.SomeMethod() <--would like SomeMethod to pop up in intellisense
これを行うために私が見つけた唯一の方法は次のとおりです。
((FooClass)dictionary.foo).SomeMethod()
よりエレガントな構文を推奨できる人はいますか? IDynamicMetaObjectProvider を使用して DynamicDictionary のカスタム実装を作成することに問題はありません。
アップデート:
なぜダイナミクスなのか、そして私の特定の問題は何かと尋ねる人もいます。次のようなことができるシステムがあります。
UI.Map<Foo>().Action<int, object>(x => x.SomeMethodWithParameters).Validate((parameters) =>
{
//do some method validation on the parameters
return true; //return true for now
}).WithMessage("The parameters are not valid");
この場合、メソッド SomeMethodWithParameters には署名があります
public void SomeMethodWithParameters(int index, object target)
{
}
個々のパラメーターの検証を登録するために現在持っているものは次のようになります。
UI.Map<Foo>().Action<int, object>(x => x.SomeMethodWithParameters).GetParameter("index").Validate((val) =>
{
return true; //valid
}).WithMessage("index is not valid");
私がしたいのは:
UI.Map<Foo>().Action<int, object(x => x.SomeMethodWithParameters).index.Validate((val) =>
{
return true;
}).WithMessage("index is not valid");
これはダイナミクスを使用して機能しますが、インデックスへの参照後にインテリセンスが失われます。これは今のところ問題ありません。問題は、Visual Studio に何らかの形で型を認識させるための巧妙な構文上の方法 (上記のもの以外) があるかどうかです。これまでのところ、答えは「いいえ」のようです。
IDynamicMetaObjectProvider の汎用バージョンがあれば、
IDynamicMetaObjectProvider<T>
これは機能する可能性があります。しかし、そうではないので、質問です。