Не очень легко, нет. Отражение не работает, так как оно предполагает модель обычного типа, которая не полный диапазон dynamic
. Если вы на самом деле просто разговариваете с обычными объектами, просто используйте отражение здесь. В противном случае, я ожидаю, что вы, возможно, захотите перепроектировать код, который генерирует компилятор для базового назначения, и настроить его так, чтобы он имел гибкое имя члена. Я буду честен, хотя: это не привлекательный вариант; простое:
dynamic foo = ...
foo.Bar = "abc";
переводится как:
if (<Main>o__SiteContainer0.<>p__Site1 == null)
{
<Main>o__SiteContainer0.<>p__Site1 = CallSite<Func<CallSite, object, string, object>>.Create(Binder.SetMember(CSharpBinderFlags.None, "Bar", typeof(Program), new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null), CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.Constant | CSharpArgumentInfoFlags.UseCompileTimeType, null) }));
}
<Main>o__SiteContainer0.<>p__Site1.Target(<Main>o__SiteContainer0.<>p__Site1, foo, "abc");
Если вам нужен подход, который работает как для динамических, так и для нединамических объектов: FastMember удобен для этого и работает на уровне типа или объекта:
// could be static or DLR
var wrapped = ObjectAccessor.Create(obj);
string propName = // something known only at runtime
Console.WriteLine(wrapped[propName]);
доступно в Nuget и оптимизировано для динамических и нединамических сценариев.