border

Miembros:
Mensajes:
Temas:
Online:

Ultimo Miembro:

 
 

  #1 (permalink)  
Antiguo 08-02-2008, 01:10:10
Avatar de jrios03
Moderador
 
Registrado: ene 2005
Ubicación: Curico
Posts: 771
jrios03 Valoración +2
Contactar con jrios03 a través de MSN
Predeterminado Duda con Propiedades

Muy buenas noches amigos míos...

Bueno... me he decidido a incursionar en la programación en C#, especialmente en la versión 3.0 (Express)...

Pero me he encontrado con un gran problema al cual no le puedo encontrar la solución...

En Visual Basic 2005 tengo muchas propiedades creadas con el siguiente formato:
Código:
    Private _campo As New List(Of String)

    Property Nombre(ByVal item As Object) As String
        Get
            If TypeOf item Is Integer Then
                Return Me._campo(item)
            End If
            If TypeOf item Is String Then
                Dim o As String
                For Each o In Me._campo
                    If o.ToLower = item.ToString.ToLower Then
                        Return item
                    End If
                Next
            End If
            Return Nothing
        End Get
        Set(ByVal value As String)
            If TypeOf item Is String Then
                Me._campo(item.ToString.ToLower) = value
            ElseIf TypeOf item Is Integer Then
                Me._campo(_campo(item)) = value
            End If
        End Set
    End Property
Pero no sé de qué manera puedo transformar eso a C#... no entiendo...

Espero que alguien me entienda y sepa ayudarme... pues estoy por comenzar a desarrollar una aplicación, y C# me parece adecuado...

Saludos... y muchas gracias...
__________________
Atentamente, Juan Ríos Pizarro...
Saludos desde Chile...

PD: Perdí mi mascota... buaaaaaaaa.... al menos encontré una nueva
Responder Con Cita
  #2 (permalink)  
Antiguo 12-02-2008, 02:23:06
Avatar de Spike
Buena Participación en el Foro
 
Registrado: may 2007
Posts: 40
Spike Valoración +2
Predeterminado

Visual C# no permite propiedades parametrizadas. Te recomendaría que uses un codigo mas simple y directo, porque se hace muy dificil de mantener un codigo como el del ejemplo, sin mencionar la portabilidad. El fragmento que sigue es una función sobrecargada, pero también podes usar setters y getters como los de java:

Código:
		private List<String> _campo=new List<String>();

		public String Nombre(Object item) {
			Type tipo = item.GetType();
			String resultado=null;

			try {
				switch (tipo) {
					case TypeCode.Int32:
						resultado = _campo[(Int32)item];
						break;
					case TypeCode.String:
						//String cadena = (String)item;
						foreach (String s in _campo) {
							if (s.CompareTo(item)) {
								resultado = s;
							}
						}
						break;
				}

				return resultado;
			}
			catch (IndexOutOfRangeException ex) {

				throw ex;
			}
		}

		public void Nombre(Int32 indice, String valor) {
			if ((indice >= 0)&&(indice < _campo.Count)) {
				_campo[indice] = valor;
			}
			else {
				throw new IndexOutOfRangeException();
			}
		}

La segunda función (que reemplazaría al set) ya no necesita recibir un object, porque no necesitas pasar un string boxeado para la busqueda que tenes definida en el get de la versión de VB.

La estructura de la primera función (que reemplazaría al get) sigue recibiendo un parámetro de tipo object. Esto lo mantuve igual para que puedas ver el pararelismo con el código de VB, pero te recomendaría que implementes una función de busqueda aparte donde pases un string con la cadena a buscar y que devuelva un Int32 con el indice correspondiente a la ubicación en el List<>, y este utilizarlo para llamar a la función original, reemplazando el parámetro tipo Object por un entero. Inclusive podes hacer otra sobrecarga donde pases un string y haga la busqueda en forma interna.

Quedaría algo asi:

Código:
		private List<String> _campo=new List<String>();

		//Función de busqueda
		public Int32 Buscar(String Cadena) {
			Int32 resultado = null;

			foreach (String s in _campo) {
				if (s.CompareTo(Cadena)) {
					resultado = s;
				}
			}

			return resultado;
		}

		//función equivalente al get
		public String Nombre(Int32 indice) {
			if ((indice >= 0) && (indice < _campo.Count)) {
				return _campo[indice];
			}
			else {
				throw new IndexOutOfRangeException();
			}
		}

		//1ra sobrecarga: equivalente al get pero pasando un String como parámetro
		public String Nombre(String Cadena) {
			Int32 indice = this.Buscar(Cadena);
			String resultado = null;

			if (indice != null) {
				resultado = _campo[indice];
			}

			return resultado;
		}

		//2da sobrecarga: equivalente al set
		public void Nombre(Int32 indice, String valor) {
			if ((indice >= 0)&&(indice < _campo.Count)) {
				_campo[indice] = valor;
			}
			else {
				throw new IndexOutOfRangeException();
			}
		}
Tenés que tener cuidado con las busquedas de cadenas de texto de este tipo, porque si no hiciste una validación previa al agregar los String al List podes tener entradas duplicadas y el sistema siempre te va a devolver la 1ra coincidencia. Antes de agregar nuevos valores te conviene llamar a la función de busqueda, y si el valor devuelto es null entonces agregas tranquilo.

No se en que tipo de clase estas usando este código, pero puede ser que en vez de utilizar valores en varios List<typeof> para representar propiedades indizadas te convenga crear una clase o estructura que las reuna (si es posible), y agregarlas a un repositorio tipo List<> o BindingList<>. Las ventajas son muchisimas, imposible detallarlas aquí.

Saludos :smt003 :smt003 :smt003
__________________
"Comencé a construir un refugio antiaéreo durante la administración de Eisenhower, y suspendí los trabajos durante la de Kennedy. Hoy no estoy seguro de que sea lo suficientemente profundo..." Un Yankee
Responder Con Cita
  #3 (permalink)  
Antiguo 15-02-2008, 11:31:10
Avatar de jrios03
Moderador
 
Registrado: ene 2005
Ubicación: Curico
Posts: 771
jrios03 Valoración +2
Contactar con jrios03 a través de MSN
Predeterminado

Muchas gracias por tu aclaración y tus ejemplos...

Ahora me ha quedado más claro...

Saludos... y hasta pronto... :smt004 :smt004 :smt004
__________________
Atentamente, Juan Ríos Pizarro...
Saludos desde Chile...

PD: Perdí mi mascota... buaaaaaaaa.... al menos encontré una nueva
Responder Con Cita
Respuesta


Herramientas
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Trackbacks are habilitado
Pingbacks are habilitado
Refbacks are habilitado


Temas Similares
Tema Autor Foro Respuestas Último Mensaje
Propiedades ADO DeNiro Visual Basic 6.00 1 06-05-2007 09:11:19
Propiedades en el registro Anl Visual Basic 6.00 7 03-04-2005 08:08:16
Propiedades del DataGrid chlsaul Visual Basic.NET 2003 & 2005 1 24-02-2005 16:56:57
Propiedades de los objetos Cblackx Visual Basic 6.00 4 28-09-2004 00:10:54
Propiedades Asathor Visual Basic 6.00 2 17-09-2004 00:00:00


La franja horaria es GMT. Ahora son las 16:19:42.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO 3.1.0
A vBSkinworks Design

Alojado en el servicio Premium de Masquewebs | Diseño mejorado por MasqueWebs

right