No C # 3.0, você pode criar uma classe anônima com a seguinte sintaxe
var o1 = new { Id = 1, Name = "Foo" };
Existe uma maneira de criar dinamicamente essas classes anônimas para uma variável?
Exemplo:
var o1 = new { Id = 1, Name = "Foo" };
var o2 = new { SQ = 2, Birth = DateTime.Now };
Exemplo de criação dinâmica:
var o1 = DynamicNewAnonymous(new NameValuePair("Id", 1), new NameValuePair("Name", "Foo"));
var o2 = DynamicNewAnonymous(new NameValuePair("SQ", 2), new NameValuePair("Birth",
DateTime.Now));
Porque eu preciso fazer:
dynamic o1 = new ExpandObject();
o1."ID" = 1; <--"ID" is dynamic name
o1."Name" = "Foo"; <--"Name" is dynamic name
E Scene1:
void ShowPropertiesValue(object o)
{
Type oType = o.GetType();
foreach(var pi in oType.GetProperties())
{
Console.WriteLine("{0}={1}", pi.Name, pi.GetValue(o, null));
}
}
se eu ligar:
dynamic o1 = new ExpandObject();
o1.Name = "123";
ShowPropertiesValue(o1);
Não pode mostrar o resultado:
Name = 123
E também como converter o ExpandoObject em AnonymouseType?
Type type = o1.GetType();
type.GetProperties(); <--I hope it can get all property of o1
Por último, eu modifico o método ShowPropertiesValue ()
void ShowPropertiesValue(object o)
{
if( o is static object ) <--How to check it is dynamic or static object?
{
Type oType = o.GetType();
foreach(var pi in oType.GetProperties())
{
Console.WriteLine("{0}={1}", pi.Name, pi.GetValue(o, null));
}
}
else if( o is dynamic object ) <--How to check it is dynamic or static object?
{
foreach(var pi in ??? ) <--How to get common dynamic object's properties info ?
{
Console.WriteLine("{0}={1}", pi.Name, pi.GetValue(o, null));
}
}
}
Como implementar o método DynamicNewAnonymous ou como modificar o ShowPropertiesValue ()?
Minhas motivações são:
dynamic o1 = new MyDynamic();
o1.Name = "abc";
Type o1Type = o1.GetType();
var props = o1Type.GetProperties(); <--I hope can get the Name Property
Se eu puder ligar o método GetType de dynamicObject e Compel converter para Type fortemente tipado. O código Seamless acima pode funcionar bem.
c#
c#-3.0
anonymous-types
Instantâneo
fonte
fonte
Respostas:
Os tipos anônimos são apenas tipos regulares declarados implicitamente. Eles têm pouco a ver com isso
dynamic
.Agora, se você fosse usar um ExpandoObject e referenciá-lo por meio de uma
dynamic
variável, poderia adicionar ou remover campos rapidamente.editar
Claro que pode: basta lançar para
IDictionary<string, object>
. Então você pode usar o indexador.Você usa a mesma técnica de casting para iterar nos campos:
O código acima e mais podem ser encontrados clicando nesse link.
fonte
dynamic o1 = new ExpandObject(); o1."ID" = 1; o1."Name" = "Foo";
((IDictionary<string, object>)o1).Add("Name", "Foo");
. Você pode acessar aso1.Name
Você pode criar um ExpandoObject como este:
E depois de convertê-lo em dinâmico, esses valores se parecerão com propriedades:
No entanto, eles não são propriedades reais e não podem ser acessados usando o Reflection. Portanto, a seguinte instrução retornará um valor nulo:
fonte
Obviamente, é possível criar classes dinâmicas usando uma classe ExpandoObject muito legal. Mas recentemente trabalhei em um projeto e vi que o Expando Object não é realizado em xml no mesmo formato que uma simples classe Anonymous, foi uma pena = (, por isso decidi criar minha própria classe e compartilhá-la com vocês. Está usando reflexão e diretiva dinâmica, cria Assembly, Classe e Instância de maneira verdadeiramente dinâmica. Você pode adicionar, remover e alterar as propriedades incluídas em sua classe imediatamente. Aqui está:
Também é muito simples usar DynamicTypeBuilder, você só precisa colocar algumas linhas como esta:
Espero que este trecho de código ajude alguém =) Divirta-se!
fonte