Posso fazer um eval("something()");
para executar o código dinamicamente em JavaScript. Existe uma maneira de fazer a mesma coisa em C #?
Um exemplo do que estou tentando fazer é: tenho uma variável inteira (digamos i
) e várias propriedades pelos nomes: "Propriedade1", "Propriedade2", "Propriedade3" etc. Agora, quero realizar algumas operações na propriedade "Propriedade i " dependendo do valor de i
.
Isso é muito simples com Javascript. Existe alguma maneira de fazer isso com C #?
c#
reflection
properties
c#-2.0
Adhip Gupta
fonte
fonte
Respostas:
Infelizmente, C # não é uma linguagem dinâmica como essa.
O que você pode fazer, no entanto, é criar um arquivo de código-fonte C #, completo com classe e tudo, e executá-lo por meio do provedor CodeDom para C # e compilá-lo em um assembly e, em seguida, executá-lo.
Esta postagem do fórum no MSDN contém uma resposta com alguns exemplos de código na página:
criar um método anônimo a partir de uma string?
Eu dificilmente diria que esta é uma solução muito boa, mas é possível de qualquer maneira.
Que tipo de código você espera nessa string? Se for um subconjunto menor de código válido, por exemplo apenas expressões matemáticas, pode ser que existam outras alternativas.
Edit : Bem, isso me ensina a ler as perguntas cuidadosamente primeiro. Sim, a reflexão poderia ajudá-lo aqui.
Se você dividir a string pelo; primeiro, para obter propriedades individuais, você pode usar o código a seguir para obter um objeto PropertyInfo para uma propriedade específica de uma classe e, em seguida, usar esse objeto para manipular um objeto específico.
Link: Método PropertyInfo.SetValue
fonte
GetMethod(methodName)
vez disso, analisar os valores dos parâmetros e chamar o método usando reflexão.Usando a API de script Roslyn (mais exemplos aqui ):
Você também pode executar qualquer código:
E referencie o código que foi gerado em execuções anteriores:
fonte
Na verdade não. Você pode usar a reflexão para alcançar o que deseja, mas não será tão simples como em Javascript. Por exemplo, se você quiser definir o campo privado de um objeto como algo, pode usar esta função:
fonte
Esta é uma função eval em c #. Usei-o para converter funções anônimas (expressões Lambda) de uma string. Fonte: http://www.codeproject.com/KB/cs/evalcscode.aspx
fonte
Eu escrevi um projeto de código aberto, Dynamic Expresso , que pode converter a expressão de texto escrita usando uma sintaxe C # em delegados (ou árvore de expressão). As expressões são analisadas e transformadas em Árvores de Expressão sem usar compilação ou reflexão.
Você pode escrever algo como:
ou
Meu trabalho é baseado no artigo de Scott Gu http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx .
fonte
Tudo isso definitivamente funcionaria. Pessoalmente, para esse problema específico, provavelmente faria uma abordagem um pouco diferente. Talvez algo assim:
Ao usar padrões como esse, você deve ter cuidado para que seus dados sejam armazenados por referência e não por valor. Em outras palavras, não faça isso com primitivos. Você tem que usar suas contrapartes de classe grandes e inchadas.
Percebi que essa não é exatamente a pergunta, mas ela foi muito bem respondida e pensei que talvez uma abordagem alternativa pudesse ajudar.
fonte
Não sei se você deseja mesmo executar instruções C #, mas já pode executar instruções Javascript em C # 2.0. A biblioteca de código aberto Jint é capaz de fazer isso. É um interpretador Javascript para .NET. Passe um programa Javascript e ele rodará dentro da sua aplicação. Você pode até mesmo passar objetos C # como argumentos e fazer automação nele.
Além disso, se você quiser apenas avaliar a expressão em suas propriedades, experimente NCalc .
fonte
Você pode usar reflexão para obter a propriedade e invocá-la. Algo assim:
Ou seja, supondo que o objeto que possui a propriedade seja denominado "theObject" :)
fonte
Você também pode implementar um navegador da Web e, em seguida, carregar um arquivo html que contém javascript.
Então você vai para o
document.InvokeScript
Método neste navegador. O valor de retorno da função eval pode ser capturado e convertido em tudo o que você precisa.Fiz isso em vários Projetos e funciona perfeitamente.
Espero que ajude
fonte
Você poderia fazer isso com uma função de protótipo:
e assim por diante...
fonte
Usa reflexão para analisar e avaliar uma expressão de vinculação de dados em relação a um objeto em tempo de execução.
Método DataBinder.Eval
fonte
Eu escrevi um pacote, SharpByte.Dynamic , para simplificar a tarefa de compilar e executar código dinamicamente. O código pode ser chamado em qualquer objeto de contexto usando métodos de extensão, conforme detalhado mais aqui .
Por exemplo,
retorna 3;
retorna a representação de string do objeto de contexto;
executa essas instruções como um script, etc.
Os executáveis podem ser obtidos facilmente usando um método de fábrica, como visto no exemplo aqui - tudo que você precisa é o código-fonte e a lista de quaisquer parâmetros nomeados esperados (os tokens são incorporados usando a notação de colchetes triplos, como {{{0}} }, para evitar colisões com string.Format (), bem como sintaxes semelhantes a Handlebars):
Cada objeto executável (script ou expressão) é thread-safe, pode ser armazenado e reutilizado, suporta registro de dentro de um script, armazena informações de tempo e última exceção se encontrada, etc. Há também um método Copy () compilado em cada um para permitir criar cópias baratas, ou seja, usar um objeto executável compilado de um script ou expressão como modelo para criar outros.
A sobrecarga de execução de um script ou instrução já compilado é relativamente baixa, menos de um microssegundo em um hardware modesto, e os scripts e expressões já compilados são armazenados em cache para reutilização.
fonte
Eu estava tentando obter o valor de um membro da estrutura (classe) pelo seu nome. A estrutura não era dinâmica. Todas as respostas não funcionaram até que eu finalmente consegui:
Este método retornará o valor do membro por seu nome. Funciona em estrutura regular (classe).
fonte
Você pode verificar a biblioteca Heleonix.Reflection . Ele fornece métodos para obter / definir / invocar membros dinamicamente, incluindo membros aninhados, ou se um membro estiver claramente definido, você pode criar um getter / setter (lambda compilado em um delegado) que é mais rápido que a reflexão:
Ou se o número de propriedades não for infinito, você pode gerar setters e chache-los (setters são mais rápidos, pois são delegados compilados):
Os setters podem ser do tipo,
Action<object, object>
mas as instâncias podem ser diferentes em tempo de execução, portanto, você pode criar listas de setters.fonte
Infelizmente, C # não possui nenhum recurso nativo para fazer exatamente o que você está pedindo.
No entanto, meu programa de avaliação em C # permite avaliar o código C #. Ele fornece avaliação de código C # em tempo de execução e oferece suporte a muitas instruções C #. Na verdade, esse código pode ser usado em qualquer projeto .NET; no entanto, ele está limitado ao uso da sintaxe C #. Dê uma olhada em meu site, http://csharp-eval.com , para obter detalhes adicionais.
fonte
a resposta correta é que você precisa armazenar em cache todos os resultados para manter baixo o uso de memória.
um exemplo seria parecido com este
e adicioná-lo a uma lista
salve o id e use-o no código
espero que isto ajude
fonte