У меня есть реализация 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()
Может ли кто-нибудь порекомендовать более элегантный синтаксис? Мне удобно писать собственную реализацию DynamicDictionary с помощью IDynamicMetaObjectProvider.
ОБНОВИТЬ:
Некоторые спрашивали, почему динамика и в чем конкретно моя проблема. У меня есть система, которая позволяет мне сделать что-то вроде этого:
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>
это можно заставить работать. Но его нет, отсюда и вопрос.