none
Asignacion de un objeto a otro RRS feed

  • Pregunta

  • Hola :

    Intento obtener el objeto firma de mi clase verFirmas y asignarlo al mismo a una variable firma que se encuentra en el main.

    Pero no funciona dicha asignacion .Mis clases:

    public class Firma{

    private string firma1="NO";

            private string firma1="NO";

    //aca tengo los getters y setters

    }

    tengo otra clase 

    public class verFirmas{

    private Firma miF; //si es public o private el resultado me da el mismo

    publc Firma metodo(){ //retorno mi objeto firma

    if(algo){

    miF.firma1="SI";

        }

    if(otracosa){

    miF.firma2="SI";

    }

     

    //si muestro por pantalla los valores miF.firma1 y miF.firma2 cuando ejecuto el programa muestra "SI" "SI"

           // por lo tanto esta entrando a los if, pero cuando hago la asignacion del objeto no muestra lo correcto

              return miF;

    }

    }static void main(){

    firmas firm=new firmas();

    verFirmas vFirm=new verFirmas;

    firm=vFirm.metodo();//estoy haciendo la prueba delmetodo de manera tal que los dos if s son true

    // por lo que el mostrar por pantalla firm deberia mostrar SI

    console.writeline(firm.firma1+" "+firm.firma2);  // muestra "NO"  "NO"

    }

    Si pueden orientarme se los agradecere. 

    martes, 13 de septiembre de 2016 14:52

Respuestas

  • el problema que tienes es que dentro del metodo isSigned() no creas la instancia de firmas

    por eso falla y nunca te enteras porque tienes un catch que no te devuelve el problema

    public firmas isSigned(string nroCert)
    {
    	firma = new firmas();
    	
    	string path = "c:\\miCarpeta\\";
    	string rut1 = path + "Certificado_" + nroCert + ".pdf";
    
    	try
    	{
    	  
    	  .
    	  .
    	  .

    agrega la linea en negrita

    y por sobre todo quita el try..catch si es que lo vas a dejar vacio

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    jueves, 15 de septiembre de 2016 13:11

Todas las respuestas

  • Hola Patriciol,

    Prueba haciendo :

       public class Firma
        {
            private string f1 = "NO";
            private string f2 = "NO";
    
            public string firma1
            {
                get { return this.f1; }
                set { this.f1 = value; }
            }
    
            public string firma2
            {
                get { return this.f2; }
                set { this.f2 = value; }
            }
        }

    La clase verFirmas :

        public class verFirmas
        {
            private Firma miF;
    
            public Firma metodo()
            {
                miF = new Firma();
    
                if (1 > 0)//Aquí la condición
                    miF.firma1 = "SI";
    
                if (2 > 1)//Aquí la condición
                    miF.firma2 = "SI";
    
                return miF;
            }
        }

    Y el main para la ejecución :

            static void Main(string[] args)
            {
                Firma firm = new Firma();
    
                verFirmas vFirm = new verFirmas();
    
                firm = vFirm.metodo();
    
                Console.WriteLine(firm.firma1 + " " + firm.firma2);
                Console.ReadKey();
            }

    Prueba y comentas como te va.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    martes, 13 de septiembre de 2016 16:07
  • Patriciol,

    Algunas consideraciones:

    1. Si tienes c# 6.0, puedes inicializar un valor en las propiedades auto-implementadas.
    2. Si el método retorna u tipo Firma, para leer el valor no es necesario crear una instancia de la misma, basta con obtener el miembro de la clase.

    Te dejo el caso:

    public class Firma
    {
    	public string f1 { get; set; } = "NO";
    	public string f2 { get; set; } = "NO";           
    }
    
    public class verFirmas
    {
    	public Firma metodo()
    	{
    		Firma firma = new Firma();
    
    		if (1 == 1)
    			firma.f1 = "SI";
    
    		if (1 == 2)
    			firma.f2 = "SI";
    
    		return firma;
    	}
    }

    Instancia la clase verFirmas:

    static void Main(string[] args)
    {
    	verFirmas vf = new verFirmas();
    
    	Console.WriteLine("f1 {0} f2 {1}", vf.metodo().f1, vf.metodo().f2);
    	Console.ReadKey();
    }


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 13 de septiembre de 2016 16:35
  • hola

    Cuando instancias verFirmas donde creas la instancia de "miF" ? porque no veo que lo asignes en ningun lado

    Es mas veo que usas

    firmas firm=new firmas();

    pero tampoco lo asignas

    >>por lo que el mostrar por pantalla firm deberia mostrar SI

    que es ese "algo" y "otracosa" que usas en el if ?

    porque si la condicion no pasa por alli no asignara el "SI"

    que pasa si usas

    static void main()
    {
    
    	verFirmas vFirm = new verFirmas();
    
    	firmas firm = vFirm.metodo();
    
    	console.writeline(firm.firma1+" "+firm.firma2);  
    
    }

    pero usa

    public class verFirmas{
    
    	private Firma miF; 
    	
    	public verFirmas()
    	{
    		miF = new Firma();
    	}
    
    
    	publc Firma metodo()
    	{ 
    		miF.firma1="SI";
    		miF.firma2="SI";
    
    		return miF;
    	}
    }

    sin los "if" para ver que asigne el valor, si lo hace entonces evalua los if porque no esta ingresando en la condicion

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 13 de septiembre de 2016 17:07
  • Hola muchachos. Antes que nada muchas gracias por su respuesta. Estoy en el trabajo de nuevo asi que puedo seguir tratando de solucionar esto. Creo que voy a tener que mostrarles mis codigo completo porque me parece que esta correcto y aun asi sigue sin trabajar como espero. Ahi va:

          

    public  class firmas
        {
            private string nroPresent;
            private string firmaVal  = "NO";
            private string firmaReg  = "NO";


             public string FirmaVal
            {
                get
                {
                    return firmaVal;
                }

                set
                {
                    firmaVal = value;
                }
            }

            public string FirmaReg
            {
                get
                {
                    return firmaReg;
                }

                set
                {
                    firmaReg = value;
                }
            }

            public string NroPresent
            {
                get
                {
                    return nroPresent;
                }

                set
                {
                    nroPresent = value;
                }
            }

        }

    **************************

         

    class obtFirmas

        {

            //campo
            public  firmas firmas;//=new firmas();


            //metodos
            //constructor
            public obtFirmas()
            {
                firmas = new firmas();
            }
            //si estan firmadas las secciones
            public firmas isSigned(string nroCert)
            {

                string path = "c:\\miCarpeta\\";
                string rut1 = path + "Certificado_" + nroCert + ".pdf";

                try
                {
                    //creo un objeto que me permite leer los pdf usando
                    //la ruta a ellos 
                    PdfReader arcPdf = new PdfReader(rut1);

                    //obtengo los campos que se "generan" con la firma digital
                    AcroFields ac = arcPdf.AcroFields;

                    //obtengo un arreglo con las propiedades de las firmas
                    var names = ac.GetSignatureNames();



                        for (int i = 0; i < names.Count; i++)
                        {
                            //CON ESTO OBTENGO LOS NOMBRES DE LOS FIRMANTES 
                            string name = (string)names[i]; //como maximo tendra dos firmas
                            PdfPKCS7 pk = ac.VerifySignature(name);

                            string signer = pk.SignName;

                            //de acuerdo a quien sea actualizo los campos de firma
                            //enlos respectivos departamentos

      if (signer == "Algun Nombre" || signer == "Otro Nombre")
                                firmas.FirmaVal = "SI";
                            if (signer == "Otro de Regimen")
                                firmas.FirmaReg = "SI";
                        }



                }
                catch (Exception e)
                { }
             //   Console.WriteLine(firmas.FirmaReg+" "+firmas.FirmaVal);//muestrs SI SI

                return firmas;
            }

        }

    ***********************************

                                                                                                                

     static void Main(string[] args)
            {
                firmas sig= new firmas();
                obtFirmas obtSign = new obtFirmas();
                conectDB miCon = new conectDB();


                try
                {

                    DataTable certT = new DataTable();
                    certT = miCon.obtDatos();//solo es una tabla que contiene numeros correspondientes a pdf generados



                    foreach (DataRow row in certT.Rows) {



                     //isSigned retorna un objeto firma 

                           sig= obtSign.isSigned(row["nropresentacion"].ToString());
                        Console.WriteLine(sig.firmaReg + " " + sig.firmaReg);//muestra NO NO 
                        Console.WriteLine();
                     //   Console.WriteLine(obtSign.isSigned(row["nropresentacion"].ToString()).FirmaReg); muestra SI
                      //  Console.WriteLine(obtSign.isSigned(row["nropresentacion"].ToString()).FirmaVal); muestra SI
                        row["firmaval"] = "SI";
                        row["firmareg"] = "SI";
                    }
                 

                } catch(Exception e)
                {
                    Console.WriteLine(e.Message);
                }
                Console.ReadLine();

         }

    Bueno ese es el codigo. Creo que lo esencial de lo que quiero hacer esta en lo que les habia mostrado previamente,pero este es el codigo que "no anda" asi que se los pongo asi lo vean. Vi que puedo solucionarlo haciendo sig.FirmaVal=obtSign.isSigned(row["nropresentacion"].ToString()).FirmaVal) pero tengo la duda en porque no funciona correctamente la asignacion de un objeto a otro. Tengo otros codigos de prueba en los que uso una clase que en los if s de firma son mucho mas sencillos (no aparece nada de firma digital ni eso) y al retorna un obj firma y asignarlo a otro del main la asignacion es correcta. Bueno les agradezco cualquier sugerencia. 

    miércoles, 14 de septiembre de 2016 12:48
  • Hola

    Deberias usar <> Insertar bloque de cóidgo para que se vea mas legible.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    miércoles, 14 de septiembre de 2016 21:39
  • public  class firmas
        {
            private string nroPresent;
            private string firmaVal  = "NO";
            private string firmaReg  = "NO";
    
          
             public string FirmaVal
            {
                get
                {
                    return firmaVal;
                }
    
                set
                {
                 
                    firmaVal = value;
                }
            }
    
            public string FirmaReg
            {
                get
                {
                    return firmaReg;
                }
    
                set
                {
                    firmaReg = value;
                }
            }
    
            public string NroPresent
            {
                get
                {
                    return nroPresent;
                }
    
                set
                {
                    nroPresent = value;
                }
            }
    
        }
    public class obtFirmas{
    
        private firmas firma;
     
     public firmas isSigned(string nroCert)
            {
                
                string path = "c:\\miCarpeta\\";
                string rut1 = path + "Certificado_" + nroCert + ".pdf";
    
                try
                {
                    //creo un objeto que me permite leer los pdf usando
                    //la ruta a ellos 
                    PdfReader arcPdf = new PdfReader(rut1);
     
                    //obtengo los campos que se "generan" con la firma digital
                    AcroFields ac = arcPdf.AcroFields;
    
                    //obtengo un arreglo con las propiedades de las firmas
                    var names = ac.GetSignatureNames();
    
    
                    if (names.Count <= 2)
                    {
                       
                        for (int i = 0; i < names.Count; i++)
                        {
                            //CON ESTO OBTENGO LOS NOMBRES DE LOS FIRMANTES 
                            string name = (string)names[i];
                            PdfPKCS7 pk = ac.VerifySignature(name);
                          
                            string signer = pk.SignName;
    
                            //de acuerdo a quien sea actualizo los campos de firma
                            //enlos respectivos departamentos
                            if (signer == "Nombre1" || signer == "Nombre2")
                            {
                               
                                firma.FirmaVal = "SI";
                            }
                            if (signer == "Nombre3")
                            {
                                
                                firma.FirmaReg = "SI";
                            }
                        }
    
                    }
    
                }
                catch (Exception e)
                { }
             
                return firma;
            }
    }
    
    
    static void Main(string[] args)
            {
                firmas sig= new firmas();
                obtFirmas obtSign = new obtFirmas();
                conectDB miCon = new conectDB();
               
               
                try
                {
             
                    //tabla con mis nro de certificados
                    DataTable certT = new DataTable();
                    certT = miCon.obtDatos();
                  
    
                  
                    foreach (DataRow row in certT.Rows) {
                       //aca debo llamar a obtener firmas
                         
    
                      //  firmas sign = new firmas();
                           sig= obtSign.isSigned(row["nropresentacion"].ToString());
     
                       
                        row["firmaval"] = sig.FirmaVal;//"SI";
                        row["firmareg"] =sig.FirmaReg;// "SI";
    
                    }
                    //actualizo mi tabla
                    miCon.actTable(certT);
    
                } catch(Exception e)
                {
                    Console.WriteLine(e.Message);
                }
                Console.ReadLine();
    
    
               
            }
        
    Aca esta el codigo mas legible . Gracias por el consejo Pedro.
    jueves, 15 de septiembre de 2016 12:08
  • Nota:

    A la clase obtFirmas falto copiar el contructor pero en él es donde hago firma=new firmas();.

    jueves, 15 de septiembre de 2016 12:10
  • hola

    algunos consejos

    esto

     catch (Exception e)
                { }

    quitalo del codigo, NUNCA se define un catch del exception y lo dejas vacio, a lo sumo lo logueas a un archivo o devuelves el mensaje, pero nunca vacio

    Tambien puedes hacer las clases mas simple si lo escribes usando las propiedades autoimplementadas

    public class firmas
    {
    	public firmas()
    	{
    		this.FirmaVal = "NO";
    		this.FirmaReg = "NO";
    	}
      
    	public string FirmaVal{get;set;}
    
    	public string FirmaReg{get;set;}
    
    	public string NroPresent{get;set;}
    
    }

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 15 de septiembre de 2016 13:08
  • el problema que tienes es que dentro del metodo isSigned() no creas la instancia de firmas

    por eso falla y nunca te enteras porque tienes un catch que no te devuelve el problema

    public firmas isSigned(string nroCert)
    {
    	firma = new firmas();
    	
    	string path = "c:\\miCarpeta\\";
    	string rut1 = path + "Certificado_" + nroCert + ".pdf";
    
    	try
    	{
    	  
    	  .
    	  .
    	  .

    agrega la linea en negrita

    y por sobre todo quita el try..catch si es que lo vas a dejar vacio

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    jueves, 15 de septiembre de 2016 13:11
  • Gracias Leandro. Ya lo solucioné. Y mande el try-catch a un archivo de log. Gracias por los consejos.

    Saludos. 

    martes, 20 de septiembre de 2016 13:01