O título é meio obscuro. O que eu quero saber é se isso é possível:
string typeName = <read type name from somwhere>;
Type myType = Type.GetType(typeName);
MyGenericClass<myType> myGenericClass = new MyGenericClass<myType>();
Obviamente, MyGenericClass é descrito como:
public class MyGenericClass<T>
No momento, o compilador reclama que 'O tipo ou espaço de nome' myType 'não foi encontrado. "É preciso haver uma maneira de fazer isso.
foo.Method((dynamic)myGenericClass)
para a ligação do método em tempo de execução, efetivamente o padrão do localizador de serviço para sobrecargas de método de um tipo.public void Method<T>(T obj)
- um truque que eu usei mais de algumas vezes nos últimos 6 anos desde esse comentário; pRespostas:
Você não pode fazer isso sem reflexão. No entanto, você pode fazer isso com reflexão. Aqui está um exemplo completo:
Nota: se sua classe genérica aceitar vários tipos, você deverá incluir vírgulas ao omitir os nomes dos tipos, por exemplo:
fonte
Infelizmente não, não existe. Os argumentos genéricos devem ser resolvidos no momento da compilação como 1) um tipo válido ou 2) outro parâmetro genérico. Não há como criar instâncias genéricas baseadas em valores de tempo de execução sem o grande martelo de usar a reflexão.
fonte
Algumas dicas adicionais sobre como executar com o código de tesoura. Suponha que você tenha uma classe semelhante a
Suponha que, em tempo de execução, você tenha um FooContent
Se você fosse capaz de ligar em tempo de compilação, desejaria
No entanto, você não pode fazer isso em tempo de execução. Para fazer isso em tempo de execução, faça o seguinte:
Para chamar dinamicamente
Markdown(IEnumerable<FooContent> contents)
Observe o uso de
dynamic
na chamada de método. No tempo de execução,dynamicList
haveráList<FooContent>
(adicionalmente também sendoIEnumerable<FooContent>
), pois mesmo o uso de dinâmico ainda está enraizado em uma linguagem fortemente tipada, o fichário de tempo de execução selecionará oMarkdown
método apropriado . Se não houver correspondências exatas de tipo, ele procurará um método de parâmetro de objeto e se nenhuma delas corresponder a uma exceção do fichário de tempo de execução será gerada, alertando que nenhum método corresponde.A desvantagem óbvia dessa abordagem é uma enorme perda de segurança de tipo em tempo de compilação. No entanto, o código nesse sentido permitirá operar em um sentido muito dinâmico, que no tempo de execução ainda é totalmente digitado conforme o esperado.
fonte
Meus requisitos eram um pouco diferentes, mas espero ajudar alguém. Eu precisava ler o tipo de uma configuração e instanciar o tipo genérico dinamicamente.
Finalmente, aqui está como você chama. Defina o tipo com um backtick .
fonte
Se você souber quais tipos serão passados, poderá fazer isso sem reflexão. Uma declaração de chave funcionaria. Obviamente, isso funcionaria apenas em um número limitado de casos, mas será muito mais rápido que a reflexão.
fonte
Neste snippet, quero mostrar como criar e usar uma lista criada dinamicamente. Por exemplo, estou adicionando à lista dinâmica aqui.
Da mesma forma, você pode invocar qualquer outro método na lista.
fonte