Domanda

Esiste un modo per creare un oggetto anonimo C # 3.0 tramite Reflection in fase di esecuzione in .NET 3.5? Vorrei supportarli nel mio schema di serializzazione, quindi ho bisogno di un modo per manipolarli a livello di programmazione.

modificato in seguito per chiarire il caso d'uso

Un ulteriore vincolo è che eseguirò tutto all'interno di un'app Silverlight, quindi i runtime extra non sono un'opzione e non sono sicuro di come funzionerà la generazione di codice al volo.

È stato utile?

Soluzione

Ecco un altro modo, sembra più diretto.

object anon = Activator.CreateInstance(existingObject.GetType());

Altri suggerimenti

Sì, c'è. Dalla memoria:

public static T create<T>(T t)
{
    return Activator.CreateInstance<T>();
}

object anon = create(existingAnonymousType);

Usa la riflessione per ottenere il Tipo, usa GetConstructor sul tipo, usa Invoke sul costruttore.

Modifica: grazie a Sklivvz per aver sottolineato che ho risposto a una domanda che non è stata posta;)

La risposta alla domanda reale: ho scoperto che generare codice C # e quindi usare CodeDomProvider (ma non CodeDOM stesso - terribile) e poi compilarlo e riflettere i tipi di ciò è il modo più semplice di fare 'anonimo 'oggetti in fase di esecuzione.

Potresti voler esaminare il DLR. Non l'ho fatto da solo (ancora) ma il caso d'uso per il DLR (linguaggi dinamici) sembra molto simile a quello che stai cercando di fare.

A seconda di cosa si desidera fare, anche l'oggetto proxy dinamico di Castle-framework potrebbe essere adatto.

Puoi usare Reflection.Emit per generare dinamicamente le classi richieste, anche se è abbastanza brutto codificare.

Se decidi di seguire questo percorso, ti suggerirei di scaricare Addin lingua riflessa emettere per . NET Reflector , in quanto ciò ti consente di vedere come verranno costruite le classi esistenti usando Reflection. Emetti, quindi un buon metodo per imparare questo angolo del framework.

Potresti anche dare un'occhiata alla classe FormatterServices: voce MSDN su FormatterServices

Contiene GetSafeUninitializedObject che creerà un'istanza vuota della classe e molti altri metodi utili durante la serializzazione.

In risposta al commento di Michael: Se non hai l'istanza Type per il tipo T, puoi sempre ottenerla da typeof (T). Se si dispone di un oggetto di tipo sconosciuto, è possibile richiamare GetType () su di esso per ottenere l'istanza Type.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top