2010-10-24 12 views
6

Ich möchte einen anonymen Typ innerhalb einer Funktion erstellen, wenn die Eigenschaften des anonymen Typs die Funktionsparameter sind.Erstellen Sie einen anonymen Typ aus Reflection ParamInfo []

zum Beispiel für die Funktion: private bool CreatePerson (Zeichenfolge FirstName, String LasName, int Age, int Höhe);

Ich habe einen anonymen Typ mit den Eigenschaften: Vorname, LasName, Alter und Größe. und die Werte der Funktionsparameter sind die Werte der Eigenschaften des anonymen Typs.

+0

Sie möchten einen anonymen Typ mit bekannten Feldnamen und Typen erstellen, warum brauchen Sie eine Reflexion? new {Vorname = Vorname, ...} würde gut gehen? – SoftMemes

+0

Er will, dass in der Laufzeit definiert wird - ich glaube. – Aliostad

+0

@Aliostad - aber die Beschreibung besagt nur, dass die _values_ von den Parametern kommen sollten, die Namen der Parameter/Eigenschaften sind schon da ... – SoftMemes

Antwort

2

Wenn ich richtig verstanden habe und Sie die Eigenschaften zur Laufzeit definieren möchten, ist dies nicht möglich. Obwohl Sie in anonymen Typen möglicherweise Typen erstellen können, die Sie dort definieren, und dann Werte zuweisen, muss der Name der Eigenschaften um kompilierte Zeit bekannt sein.

In der Tat, der Typ ist anonym für Sie, aber nicht auf die CLR. Wenn Sie sich die Assembly in ildasm.exe oder reflector ansehen, sehen Sie diese anonymen Typen mit seltsamen Namen, die immer <> im Namen haben.

C# 's dynamisch könnte in der Lage sein, hier zu helfen, aber soweit ich weiß, sie helfen mit mit Objekten zu kommunizieren, die sind, dass wir Typinformationen nicht für, nicht zu schaffen - aber es könnte ein Weg sein, die ich tue nicht wissen.

+0

Es wäre durchaus möglich, Reflection.Emit zu verwenden, um einen neuen Typ zur Laufzeit zu generieren, aber ich sehe nicht, warum Sie so etwas wollen. – SoftMemes

+0

Wahr, Code schreiben und kompilieren ist immer eine Möglichkeit, aber das will er nicht tun. – Aliostad

+0

Reflection.Emit ist nicht wirklich "Code schreiben und kompilieren", da es keinen Quellcode gibt, aber ich stimme zu, dass es höchstwahrscheinlich nicht das ist, was er braucht. – SoftMemes

0

Konnten Sie das Entwurfsmuster "Linq to DataSet" Field<T>(String Name) nicht verwenden? In der Tat, warum nicht einfach eine DataTable verwenden. Der Compiler muss nicht wissen, dass das Feld existiert, nur welchen Typ es typsicher sein soll. Ein Grund dafür wäre die Implementierung eines Parser-Typs zum Generieren von Filtern oder das dynamische Konfigurieren von Feldnamen.

Verwandte Themen