我有一个 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
我想要的是在引用其中一个字典条目的方法时能够让 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>
这可以发挥作用。但没有,因此问题。