Nicht sehr einfach, nein. Reflektion funktioniert nicht, da es ein normales Typmodell annimmt, das nicht der volle Bereich von dynamic
ist. Wenn Sie nur mit regulären Objekten sprechen, dann verwenden Sie einfach die Reflektion hier. Andernfalls erwarte ich, dass Sie den Code, den der Compiler für eine grundlegende Zuweisung ausgibt, rückentwickeln möchten, und optimieren Sie ihn, um einen flexiblen Mitgliedsnamen zu erhalten. Ich werde jedoch ehrlich sein: das ist keine attraktive Option; ein einfaches:
dynamic foo = ...
foo.Bar = "abc";
übersetzt:
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");
Wenn Sie einen Ansatz wollen, die für dynamische und nicht-dynamischen Objekten funktioniert: FastMember für diese praktisch ist, und arbeitet entweder an der Typ oder Objektlevel:
// could be static or DLR
var wrapped = ObjectAccessor.Create(obj);
string propName = // something known only at runtime
Console.WriteLine(wrapped[propName]);
verfügbar auf Nuget, und stark optimiert für dynamische und nicht dynamische sc Enarios.
Reflection ist wahrscheinlich Ihre eigene Lösung, es sei denn, Sie fügen Ihre Eigenschaften in eine Hashmap ein, damit sie zur Laufzeit ermittelt werden können. –
mögliches Duplikat von [Hinzufügen unbekannter (zur Entwurfszeit) Eigenschaften zu einem ExpandoObject] (http://stackoverflow.com/questions/2974008/adding-unknown-at-design-time-properties-to-an-expandoobject) – nawfal