Aquí es una solución totalmente diferente para usted:
crear clases derivadas de System.Web.UI.Page que tienen los parámetros de cadena de consulta como propiedades. Además, al usar una función de utilidad (vea ConvertType, a continuación), no necesita hacer demasiado para obtener los datos de QueryString. Por último, dentro de esas clases derivadas, defina una clase interna estática que contenga constantes que son los nombres de los parámetros de QueryString para que no necesite hacer referencia a ningún valor mágico en ningún lugar.
generalmente defino una clase de página de base para mi proyecto, lo que hace que sea un lugar conveniente para hacer las cosas comunes que ocurren en todas las páginas, así como un par de funciones de utilidad:
public class MyBasePage : System.Web.UI.Page
{
public T GetQueryStringValue<T>(
string value,
T defaultValue,
bool throwOnBadConvert)
{
T returnValue;
if (string.IsNullOrEmpty(value))
return defaultValue;
else
returnValue = ConvertType<T>(value, defaultValue);
if (returnValue == defaultValue && throwOnBadConvert)
// In production code, you'd want to create a custom Exception for this
throw new Exception(string.Format("The value specified '{0}' could not be converted to type '{1}.'", value, typeof(T).Name));
else
return returnValue;
}
// I usually have this function as a static member of a global utility class because
// it's just too useful to only have here.
public T ConvertType<T>(
object value,
T defaultValue)
{
Type realType = typeof(T);
if (value == null)
return defaultValue;
if (typeof(T) == value.GetType())
return (T)value;
if (typeof(T).IsGenericType)
realType = typeof(T).GetGenericArguments()[0];
if (realType == typeof(Guid))
return (T)Convert.ChangeType(new Guid((string)value), realType);
else if (realType == typeof(bool))
{
int i;
if (int.TryParse(value.ToString(), out i))
return (T)Convert.ChangeType(i == 0 ? true : false, typeof(T));
}
if (value is Guid && typeof(T) == typeof(string))
return (T)Convert.ChangeType(((Guid)value).ToString(), typeof(T));
if (realType.BaseType == typeof(Enum))
return (T)Enum.Parse(realType, value.ToString(), true);
try
{
return (T)Convert.ChangeType(value, realType);
}
catch
{
return defaultValue;
}
}
}
public class MyPage : MyBasePage
{
public static class QueryStringParameters
{
public const string Age= "age";
}
public int Age
{
get
{
return base.GetQueryStringValue<int>(Request[QueryStringParameters.Age], -1);
}
}
}
Luego, en su página normal, en el código subyacente, que ahora se ve así:
public partial class MyWebPage : MyPage
{
protected void Page_Load(object sender, EventArgs e)
{
Foo myFoo = new Foo();
Foo.Age = this.Age;
}
}
esto hace que el código detrás de clases muy (como se puede ver), y es fácil de mantener, porque se hace todo el trabajo pesado limpia por dos funciones (Obtener QueryStringValue y ChangeType) que se reutilizan en cada una de las clases de página, y todo es seguro para tipos (notará en GetQueryStringValue que puede especificar si la función se lanza si el valor no se puede convertir o simplemente usa el valor predeterminado de devolución; ambos son apropiados en diferentes momentos, dependiendo de su aplicación).
Además, puede escribir fácilmente un plugin VS o un script CodeSmith para generar la clase de página derivada con bastante facilidad. Y no hay un montón de delegados y cosas que se pasen, que encuentro que a los nuevos desarrolladores les cuesta mucho entender.
Duplicado de http://stackoverflow.com/questions/1867708/how-to-pass-properties-by-reference-in-c –
Bueno, sí, el título de la pregunta es el mismo pero se pregunta en una manera muy confusa ... – ctrlShiftBryan