Eu tenho uma classe que se parece com isso:
public class Field
{
public string FieldName;
public string FieldType;
}
E um objeto List<Field>
com valores:
{"EmployeeID","int"},
{"EmployeeName","String"},
{"Designation","String"}
Eu quero criar uma classe que se parece com isso:
Class DynamicClass
{
int EmployeeID,
String EmployeeName,
String Designation
}
Há alguma maneira de fazer isso?
Eu quero que isso seja gerado em tempo de execução. Eu não quero um arquivo CS físico residindo no meu sistema de arquivos.
c#
.net
reflection.emit
dynamic-class-creation
ashwnacharya
fonte
fonte
System.ServiceModel.ChannelFactory<MyDynamicInterface>
Respostas:
Sim, você pode usar um
System.Reflection.Emit
espaço para nome para isso. Não é fácil se você não tem experiência com isso, mas é certamente possível.Edit: Este código pode ser falho, mas lhe dará a idéia geral e, com sorte, um bom começo em direção à meta.
fonte
Vai levar algum trabalho, mas certamente não é impossível.
O que eu fiz é:
Microsoft.CSharp.CSharpCodeProvider
(CompileAssemblyFromSource)Activator.CreateInstance
)Dessa forma, você pode lidar com o código C # que você já conhece, em vez de precisar emitir o MSIL.
Mas isso funciona melhor se a sua classe implementa alguma interface (ou é derivada de alguma classe básica); caso contrário, como o código de chamada (read: compiler) deve saber sobre essa classe que será gerada no tempo de execução?
fonte
Você também pode criar dinamicamente uma classe usando DynamicObject .
Eu armazeno todos os campos de classe em um dicionário,
_fields
juntamente com seus tipos e valores. Os dois métodos são para obter ou definir valor para algumas das propriedades. Você deve usar adynamic
palavra-chave para criar uma instância desta classe.O uso com seu exemplo:
Edit: E aqui está como fica minha classe
Field
:fonte
dynamic obj = new DynamicClass(fields){EmployeeId=123456;EmployeeName = "John"; Designation = "Tech Lead";}
seria ótimo fazer isso.Eu sei que reabrir esta tarefa antiga, mas com o c # 4.0 essa tarefa é absolutamente indolor.
para mais, consulte https://www.oreilly.com/learning/building-c-objects-dynamically
fonte
Não sei o uso pretendido dessas classes dinâmicas, e a geração de código e a compilação em tempo de execução podem ser feitas, mas é preciso algum esforço. Talvez tipos anônimos ajudassem você, algo como:
fonte
Field.FieldName
. Ter que codificar os nomes dos campos anula o objetivo. Se você precisar fazer isso, crie a classe.Você quer ver o CodeDOM . Permite definir elementos de código e compilá-los. Citando o MSDN:
fonte
Com base na resposta de @ danijels, crie dinamicamente uma classe no VB.NET:
fonte
Você também pode criar dinamicamente uma classe usando DynamicExpressions .
Como os 'Dictionary' têm inicializadores compactos e lidam com colisões importantes, você deve fazer algo assim.
Ou você pode usar um conversor JSON para construir seu objeto de seqüência de caracteres serializado em algo gerenciável.
Em seguida, usando System.Linq.Dynamic;
O resto está apenas usando System.Reflection.
fonte
Para aqueles que desejam criar uma classe dinâmica, apenas propriedades (por exemplo, POCO) e crie uma lista dessa classe. Usando o código fornecido posteriormente, isso criará uma classe dinâmica e criará uma lista disso.
Aqui estão as classes que o código anterior usa.
Nota: Você também precisará fazer referência à biblioteca Microsoft.CodeAnalysis.CSharp.
fonte
Você pode usar módulos e classes dinâmicos que podem fazer o trabalho. A única desvantagem é que ele permanece carregado no domínio do aplicativo. Mas com a versão do .NET framework sendo usada, isso pode mudar. O .NET 4.0 suporta assemblies dinâmicos colecionáveis e, portanto, você pode recriar as classes / tipos dinamicamente.
fonte
Uau! Obrigado por essa resposta! Adicionei alguns recursos a ele para criar um conversor "datatable para json" que eu compartilho com você.
E no sub "compileresulttype", mudei isso:
fonte
Você pode usar System.Runtime.Remoting.Proxies.RealProxy. Isso permitirá que você use código "normal" em vez de material de tipo de montagem de baixo nível.
Veja a resposta do RealProxy a esta pergunta para um bom exemplo:
Como interceptar uma chamada de método em c #?
fonte
Runtime Code Generation with JVM and CLR
- Peter SestoftTrabalhe para pessoas realmente interessadas neste tipo de programação.
Minha dica para você é que, se você declarar algo, tente evitar a string, portanto, se você tiver a classe Field, é melhor usar a classe System.Type para armazenar o tipo de campo do que uma string. E, para obter as melhores soluções, em vez de criar novas classes, tente usar as que foram criadas como FiledInfo, em vez de criar novas.
fonte