Domanda

Devo fare quanto segue:

var someType = ObjectFactory.GetNamedInstance("myNamedInstance");

dove sometype può essere qualsiasi implementazione di ICommand.

così ho registrato alcuni di loro:

For(typeof(ICommand<>)).Use(typeof(Command1)).Named("myNamedInstance1");
For(typeof(ICommand<>)).Use(typeof(Command2)).Named("myNamedInstance2");

c'è un modo per fare questo in StructureMap, perché GetNamedInstance richiede il parametro tipo che io don3t so fino a runtime?.

È stato utile?

Soluzione

(Per questo, sto assumendo si ICommand<T> creato)

Questo in realtà non ha alcun senso ... pensa della linea:

//where aString is either myNamedInstance1 or myNamedInstance2
var someType = ObjectFactory.GetNamedInstance(aString);

Ora per scontato che non si ha intenzione di utilizzare var, e invece il tipo effettivo. Che cosa mettere lì che potrebbe compilare? Vale a dire, che tipo può sometype eventualmente essere diversa object?

Inoltre, ricorda che ICommand<string> e ICommand<int> sono entrambi i tipi di ICommand<T> costruito, ma non sono altrimenti connesso -. Non hanno alcun tipo di base comune diverso da object

Se non il tipo fino al runtime, i generici non stanno andando per aiutare un gruppo - invece rendere la vostra eredita ICommand<T> da qualche un'interfaccia comune - come ICommandBase -. Che ha i metodi che realmente avete bisogno

Tuttavia, se proprio non si conosce il tipo di in quel metodo , si può spingere l'ignoto "up" nella compilazione, rendendo il metodo contenente tale generico:

public void Execute<T>( string commandName)
{        
    var someType = ObjectFactory.GetNamedInstance<ICommand<T>>(commandName);
    someType.Execute();
}

Ora il chiamante di eseguire esigenze del tipo param ... ma ancora una volta si poteva spingere che fino. Si noti che alla fine è necessario il parametro di tipo.

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