Reflection - rzutowanie/konwertowanie

0

mam abstrakcyjna klase bazowa (A) z walsciwoscia double (value)
oraz trzy klasy po niej dziedziczace (X,Y,Z)

w kazdej klasie dziedziczacej mam operatory:
implicit operator X(string) // czyli X x = "11X"
implicit operator X(double) // czyli X x = 1.23D
explicit operator Y(X) // czyli Y y = (Y)x
explicit operator Z(X) // czyli Z z = (Z)x

X operator +(X,X) // czyli X x = x1 + x2
X operator -(X,X) // czyli X x = x1 - x2

jednak chcialbym moc wykonac operacja X + Y - Z, bez koniecznosci rzutowania (bo to dziala: X + (X)Y - (X)Z)

chcialbym w mojej klasie bazowej A napisac operatory + i - tak aby automatycznie wykonywaly rzutowania/konwersje pomiedzy typami, czyli cos w stylu

public static object operator +(A a1, A a2)
{
  return Activarot.CreateInstance(a1.GetType(), a1.value + (???)a2.value);
}

bo skoro juz mam operatory konwersji explicit, to chcialbym je jakos wykorzystac, aby nie pisac kolejny raz podobnego kodu
moge storzyc inna klase do konwercji miedzy typami (lub miec jakas funkcje w klasie bazowej), ale czy nie da sie jednak uzyc juz posiadanych operatorow uzywajac Reflection?

0

heh, sam sobie odpowiem, jesli ktos ma zastrzezenia walcie smialo:

public static object operator +(A t1, A t2)
        {
            A t2t = null;
            System.Reflection.MethodInfo[] mi = t2.GetType().GetMethods();
            foreach (System.Reflection.MethodInfo m in mi)
            {
                if (m.Name == "op_Explicit" && m.ReturnType.Equals(t1.GetType()))
                {
                    System.Reflection.ParameterInfo[] pi = m.GetParameters();
                    if (pi.Length == 1 && pi[0].ParameterType.Equals(t2.GetType()))
                    {
                        t2t = (A)m.Invoke(t1, new object[] { t2 });
                        break;
                    }
                }
            }
// tak, tak, tu jeszcze sprawdze czy t2t != null i albo rzuce bledem, albo potraktuje wartost t2t jako 0, jeszcze pomysle
            return Activator.CreateInstance(t1.GetType(), t1.value + t2t.value);
        }

1 użytkowników online, w tym zalogowanych: 0, gości: 1