Dieser Code ist tödlich fehlerhaft.
Es tut Arbeit, solange Sie diese Eigenschaft angeben:
void Bar()
{
Foo(new {Position = 0});
}
void Foo(dynamic args)
{
Console.WriteLine(args.Position);
}
Das wird ausgegeben 0
, wird es nicht werfen RuntimeBinderException
.
Der Zweck eines solchen Codes ist jedoch die Möglichkeit, dass der Anrufer nur die erforderlichen Eigenschaften angeben und den Rest auslassen.
Sie versuchen, diese Auslassung über zu überprüfen if(args.Position != null)
. Das funktioniert aber nicht, es erfordert bereits Position
existieren.
Wenn Sie einen Blick auf die Routing-API von ASP.NET haben, die auch diese anonymen Konfigurationsobjekte unterstützt, werden Sie feststellen, dass der Typ des Parameters ist object
und nicht dynamic
.
Verwendet object
anstatt dynamic
Aktiviert es Ihrer API, über Montagegrenzen verwendet zu werden.
Wie funktioniert es?
Wie in der verknüpften Antwort müssen Sie ein Wörterbuch der Eigenschaften manuell erstellen. Ob Sie ein einfaches altes verwenden Dictionary<string, object>
oder an ExpandoObject
ist eine Frage der Vorlieben.
Verwendet ExpandoObject
Funktioniert Ihren Code ein bisschen einfacher, um zu lesen und zu schreiben, aber es ist nicht erforderlich.
Über die tatsächliche Ausnahme, die Sie erhalten:
Bitte beachten Sie, dass es Ihnen sagt, dass es nicht das finden kann Position
Eigentum an object
. Wenn es ein anonymer Typ wäre, der das fehlte Position
Eigenschaft Die Ausnahmenachricht bezieht sich nicht auf object
aber zu einem anonymen Typ. Etwas wie das:
'<>f__AnonymousType0'
enthält keine Definition für 'Position'