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