Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #59 da revista programar. Faz já o download aqui!

iron

Dúvida com Emit

Mensagens Recomendadas

iron    7
iron

Boas.

 

List<PropertyInfo> propertys = typeof(T)
	.GetProperties()
        .Where(x => x.GetCustomAttributes(typeof(AllAttributes), false).Length > 0)
        .ToList();

foreach (PropertyInfo property in propertys)
{
	MethodAttributes getSetAttr = MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig | MethodAttributes.Virtual;
	MethodBuilder method = tb.DefineMethod(
		"set_"+ property.Name,
		getSetAttr,
		null,
		new Type[] { property.PropertyType });

	ILGenerator gen = method.GetILGenerator();
	List<Attribute> list = property.GetCustomAttributes(typeof(Attribute)).ToList();
	foreach (AllAttributes a in list)
	{
		gen.Emit(OpCodes.Ldarg_0);
		gen.Emit(OpCodes.Ldarg_1);
		gen.Emit(OpCodes.Call, a.GetType().GetMethod("Validator")); //Código está errado 
	}
	gen.Emit(OpCodes.Ldarg_0);
	gen.Emit(OpCodes.Ldarg_1);
	gen.Emit(OpCodes.Call, typeof(T).GetProperty(property.Name).GetSetMethod());
	gen.Emit(OpCodes.Ret);

}

 

 

A minha dúvida é referente ao foreach (AllAttributes a in list) quando estou a redefinir propriedades.

Necessito de criar uma nova instância do meu atributo para poder fazer a chamada ao método Validator(object o) ou existe alguma maneira de usar o meu "a" para essa chamada?

P.S: Alguns atributos podem ter variáveis de instância.

AllAttributes é uma interface que contém o método void Validator(object o) e que é implementada pelos atributos.

 

 

 

E outra dúvida:

Depois de fazer load de todos os parâmetros de um método, como faço para fazer a chamada a um método que recebe como parâmetro um "params object[] o"?

 

Desde já obrigado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
RGanhoto    2
RGanhoto

Olá, Ora então por onde começar.

Primeiro, o que estás a fazer onde dá erro, é obter um MethodInfo (Vamos precisar dele)

É necessário fazer isto em 2 passos.
 

MethodInfo methodInfo = a.GetType().GetMethod("Validator");

methodInfo.Invoke(a, null);

 

Em que null é a indicar que não tem parâmetros,

Caso tenha parâmetos, é no invoke que os tens que adicionar, ordenados de acordo com o teu método.

 

Sendo o teu a uma variável com o interface AllAttributes, não podes simplesmente chamar a.Validator() em vez de usares reflection?

 

 

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
iron    7
iron

Desde já obrigao.

Já tinha resolvido o problema da seguinte forma:

   - ir buscar o valor do field do atributo caso este tenha

   - chamar o construtor do atributo

   - chamar o metodo "validator"

 

Não posso chamar, pois estou a redefinir todo os métodos. A lógica é chamar a validação e depois chamar a base. Logo não iria poder chamar directamente o "Validator".

O objectivo é criar uma dll que depois sabe tratar o tipo passado. 

 

Por exemplo:

[NonNull]
int a{get; set;}

Em que NonNull é o set não aceita o valor null, tenho de redefinir a propriedade para para quando o utilizador faz "set", chamar primeiro o "Validator" do atributo e só depois chamar o set da base. Daí a minha dúvida.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.