iron Posted August 29, 2016 at 03:35 PM Report #598454 Posted August 29, 2016 at 03:35 PM 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 Cumprimentos, iron
RGanhoto Posted September 4, 2016 at 11:55 AM Report #598619 Posted September 4, 2016 at 11:55 AM 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?
iron Posted September 4, 2016 at 03:28 PM Author Report #598620 Posted September 4, 2016 at 03:28 PM 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. Cumprimentos, iron
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now