Domanda

Per esempio, in un .NET app.config si potrebbe ottenere

<configuration>
   <configSections>
      <section name="MyConfig" type="MyAssembly.MyType, MyAssembly, PublicKeyToken=null" />
   </configSections>
   ...
</configuration>

La firma nella parte di tipo sembra essere standardizzati in una varietà di luoghi NET, ma non ho idea di come fare questo entro i miei programmi. Ho System.Activator usato nei miei programmi, ma che si sente come se fossi la duplicazione di lavoro che .NET fa già.

In programmazione termini come faccio a fare questo:

void Main()
{
   object instance = CreateInstance("MyAssembly.MyType, MyAssembly, PublicKeyToken=null");
   Console.WriteLine(instance.GetType().Name);
}

object CreateInstance(string dotNetTypeSignature)
{
   // Code goes here.
}
È stato utile?

Soluzione

È possibile chiamare il Type.GetType metodo per ottenere un oggetto Type con il dato nome (catena di montaggio qualificato).

È possibile chiamare il Activator.CreateInstance metodo per creare un'istanza di un tipo. (Assumendo che il tipo ha un costruttore di default pubblica, o che si sa che cosa costruttore di argomenti che ci vuole).

Ad esempio:

Activator.CreateInstance(Type.GetType(name));

Altri suggerimenti

Queste sezioni sono in genere creati / accede con designer di Visual Studio impostazioni.

Nel sguardo Esplora soluzioni sotto Proprietà-> Settings.settings o tramite tasto destro del mouse sul progetto nome-> Proprietà-> Impostazioni.

Il nome di tipo completo è di solito usato per fare "in ritardo" il legame con un determinato tipo. Nell'esempio file di configurazione che hai, il tipo di sezione di configurazione attuale non era noto al momento CLR compilazione, in modo che il ConfigurationManager deve leggere il modulo di tipo effettivo del file di configurazione e isntantiate è in fase di esecuzione. Questo viene fatto utilizzando la classe System.Activator, come lei ha ricordato, ed è il modo standard per farlo in tutto il mondo .Net.

Naturalmente, se il tipo che si desidera creare un'istanza di è noto al momento della compilazione, si deve solo fare riferimento l'assemblea che lo contiene e l'uso new. Tuttavia, se si desidera implementare run-time estensibilità come il ConfigurationManager, è necessario utilizzare il Activator CreateInstance o CreateInstanceFrom metodi, che hanno le sostituzioni che permettono di passare la stringa esatta come letto da qualunque configurazione si utilizza, o un'istanza di Type, che può anche essere creato dalla stessa stringa.

E, naturalmente, c'è l'altro lato, in cui qualsiasi implementazione del punto di estensibilità ha bisogno di scrivere il nome di tipo completo. Per fare questo, è possibile utilizzare typeof(MyType).FullName, o myInstance.GetType().FullName.

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