I'm doing a WPF exercise, an employee management form, and I can't find a way to access the "Employee" object type, which is the parent class, of an array of employees to find the methods of the child classes (EmpleadoFijo , EmployeeTemporal and EmployeexHours) in the button private void btCalcularSueldo(object sender, RoutedEventArgs e)
, each child class has a specific method to calculate their salary, please I need some guidance to be able to continue. I paste in the code for the class that handles the form's button method where I'm stuck.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace EjercicioWPF1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
List<Empleado> lista_empleados = new List<Empleado>();
int posicion = 0;
public MainWindow()
{
Empleado emp1 = new EmpleadoFijo("Juan", 31, "34876273f", "técnico", 1000, 2017);
Empleado emp2 = new EmpleadoTemporal("Lucas", 38, "45632187d", "administración", 1100, new DateTime(2011, 6, 3), new DateTime(2012, 6, 3));
Empleado emp3 = new EmpleadoxHoras("Sandra", 28, "29463218t", "ventas", 900, 90);
lista_empleados.Add(emp1);
lista_empleados.Add(emp2);
lista_empleados.Add(emp3);
this.DataContext = lista_empleados;
InitializeComponent();
}
private void btCalcularSueldo(object sender, RoutedEventArgs e)
{
EmpleadoFijo empp1 = new EmpleadoFijo();
EmpleadoTemporal empp2 = new EmpleadoTemporal();
EmpleadoxHoras empp3 = new EmpleadoxHoras();
for (int i = 0; i < lista_empleados.Count-1; i++)
{
if (empp1.GetType() == lista_empleados[i].GetType())
{
empp1 = (EmpleadoFijo)lista_empleados[i];
Calcularsueldo.Text = empp1.sueldo_fijo().ToString();
}
if(empp2.GetType() == lista_empleados[i].GetType())
{
empp2 = (EmpleadoTemporal)lista_empleados[i];
Calcularsueldo.Text = empp2.sueldo_temporal().ToString();
}
if(empp3.GetType() == lista_empleados[i].GetType())
{
empp3 = (EmpleadoxHoras)lista_empleados[i];
Calcularsueldo.Text = empp3.sueldo_total_e_horas().ToString();
}
}
}
private void btNuevo_click(object sender, RoutedEventArgs e)
{
VentanaIntermedia ventana = new VentanaIntermedia();
ventana.ShowDialog();
}
private void btsiguiente_Click(object sender, RoutedEventArgs e)
{
posicion++;
int tope = lista_empleados.Count;
tope = tope - 1;
if (posicion > tope)
{
posicion = 0;
}
if (posicion == 0)
{
Nombre.Text = lista_empleados[0].Nombre;
Edad.Text = lista_empleados[0].Edad.ToString();
}
else
{
for (int i = 0; i <= tope; i++)
{
if (i == posicion)
{
Nombre.Text = lista_empleados[i].Nombre;
Edad.Text = lista_empleados[i].Edad.ToString();
break;
}
}
}
}
private void btanterior_Click(object sender, RoutedEventArgs e)
{
posicion--;
if (posicion < 0)
{
posicion = lista_empleados.Count-1;
}
int minimo = 0;
if (posicion == 0)
{
Nombre.Text = lista_empleados[0].Nombre;
Edad.Text = lista_empleados[0].Edad.ToString();
}
else
{
for (int i = lista_empleados.Count-1; i > minimo; i--)
{
if (i == 0)
{
i = lista_empleados.Count;
}
if (i == posicion)
{
Nombre.Text = lista_empleados[i].Nombre;
Edad.Text = lista_empleados[i].Edad.ToString();
break;
}
}
}
}
}
}
For example, here I put the EmployeeFijo class so that the method I intend to call can be seen: public double sueldo_fijo()
from MainWindow
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EjercicioWPF1
{
internal class EmpleadoFijo : Empleado
{
#region atributo
private int anio_alta;
private double sueldo_E_fijo;
#endregion
#region propiedades
public double Sueldo_E_fijo
{
get { return sueldo_E_fijo; }
set { }
}
public int Anio_alta
{
get { return anio_alta; }
set { anio_alta = value; }
}
#endregion
#region constructor
public EmpleadoFijo(string nombre, int edad, string nif, string puesto,int sueldo_base, int anio_alta)
: base(nombre, edad, nif, puesto, sueldo_base)
{
this.Anio_alta = anio_alta;
Sueldo_E_fijo = sueldo_fijo();
}
#endregion
public double sueldo_fijo()
{
string date = DateTime.Now.ToString("yyyy");
int antiguedad = int.Parse(date) - Anio_alta;
int extra = antiguedad*50;
sueldo_E_fijo = Sueldo_base + extra;
return sueldo_E_fijo;
}
#region override tostring
public override string ToString()
{
return base.ToString() + " año de alta: " + Anio_alta;
}
#endregion
}
}
To recognize custom object types you can try with
typeof
, with this you can make aswitch
or aif
multiple and declare it like this:I don't think I need to show the solution in more detail because it really is very simple.