How to reflect on overloaded operators in C#?

Asked

Viewed 108 times

6

My problem is this: I’m writing an interpreter and I need to perform dynamic operations between various types.

For this use dynamic links provided by DLR consisting of a static object encapsulated within a meta-dynamic object.

It happens that when reflecting on the public members of a Int32 (the same is true for other descendants of ValueType) fields, properties, methods and constructors are successfully obtained, but arithmetic operators(op_xxx) and their overloads do not appear as a result of reflection.

I’ve tried the function Type.GetMethods() and the result is the same.

How do I get the MemberInfo or MethodInfo for arithmetic operators and overloaded operators?

PS: Members is a dictionary whose keys are string and values are lists of MemberInfo's.

// Nesse exemplo eu faço a reflexão sobre os membros públicos do tipo Int32 mas as operações não aparecem no dicionário.
 int valor = 123; // Um valor arbitrário, o tipo que é interessante.

 //Dicionário onde ficarão guardado os resultados da reflexão.
 Dictionary<string, List<MemberInfo>> membros = new Dictionary<string,List<MemberInfo>>(); 
    //Reflete os membros de value e preenche o dicionário members.
    public Refletir() 
    {
        //obtém o tipo Int32 para reflexão
        Type tipo = valor.GetType(); 

        //Itera sobre os membros do tipo em questão
        foreach (var membro in tipo.GetMembers())
        {
            //Verifica se o dicionário já contém uma chave
            //para o nome do membro.
            if (membros.ContainsKey(membro.Name))
            {
                //Se já existir a chave adiciona o membro ao
                //valor cujo é uma lista de MemberInfo's.
                membros[membro.Name].Add(membro);
            } else {
                // Se a chave não existir é criada uma lista de
                // MemberInfo's onde é adicionada o membro atual
                // então a lista é adicionada ao dicionário de membros
                List<MemberInfo> lista = new List<MemberInfo>();
                lista.Add(membro);
                membros.Add(membro.Name, lista );
            }
        }

1 answer

2


As informed in this forum: Invoking Operators by Reflection

If you set your own operators, you can utilize them using Reflection(...).

However, with primitive types (such as Int32) this is not possible, as the compiler handles the values directly.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.