C# Passer une propriété par référence
Est-il de toute façon de transmettre la propriété d'un Objet par référence? Je sais que je peux passer l'ensemble de l'objet, mais je tiens à préciser une propriété de l'objet de définir et de vérifier ce genre donc je sais comment les analyser. Je devrais peut-être prendre une autre approche (je ne peux pas changer l'objet d'origine en tout cas)?
public class Foo{
public Foo(){}
public int Age { get; set; }
}
private void setFromQueryString(object aProperty, String queryString, HttpContext context)
{
//here I want to handle pulling the values out of
//the query string and parsing them or setting them
//to null or empty string...
String valueString = context.Request.QueryString[queryString].ToString();
//I need to check the type of the property that I am setting.
//this is null so I can't check it's type
Type t = aProperty.GetType();
}
private void callingMethod(HttpContext context)
{
Foo myFoo = new Foo();
setFromQueryString(myFoo.Age, "inputAge", context);
}
- Double de stackoverflow.com/questions/1867708/...
- Eh bien oui, le titre de la question est la même, mais que l'on est invité dans un très déroutant façon...
Vous devez vous connecter pour publier un commentaire.
Vous pouvez appeler la fonction avec une expression lambda:
Vous l'appeler comme ceci:
MODIFIER: Si vous vraiment voulez l'inférence de type:
Non, il n'est pas possible de passer directement de la propriété de référence. Visual Basic propose ce soutien dans la langue en mettant la valeur de la propriété dans une variable temp, puis qui est passé par référence et réaffectés à leur retour.
En C#, vous pouvez seulement se rapprocher de ce comportement par le passage d'un
Func<T>
pour obtenir la valeur de la propriété, et unAction<T>
pour le réglage de la valeur (à l'aide de fermetures), oùT
est le type de la propriété.Vous pourriez vous enveloppez-le bien avec un correspondant de méthodes et de délégués et de passer les délégués.
Comme d'autres l'ont souligné, vous pouvez le faire à l'aide de délégués, à l'aide de l'une des nombreuses façons de spécifier les délégués. Toutefois, si vous avez l'intention de le faire régulièrement, vous devriez envisager la création d'une enveloppe de type pour le passage des propriétés de la référence qui encapsule les délégués requis, il peut créer une belle API.
Par exemple:
De cette façon, vous pouvez passer autour d'une référence à votre propriété et de le modifier par la définition de la valeur de référence.
Passant fonction lambda est probablement la plus élégante, mais si vous voulez juste une solution simple à votre problème
Pourquoi ne pas utiliser des génériques et de retour de l'objet?
Pas très bien pourquoi vous êtes donc mis sur l'inférence, mais étant donné que vous êtes, vous pourriez le faire
Pourquoi êtes-vous si compliqué? Vous connaissez le type de la propriété au moment de la compilation, il suffit de faire le chemin le plus facile avec une seule ligne de code:
Si vous avez besoin de vérifier le type, il suffit d'ajouter une petite fonction qui enveloppe int.TryParse() et renvoie une inoffensive résultat (par exemple, 0) si vous obtenez "pdq" dans la chaîne de requête de la valeur au lieu d'un nombre.
Voici une autre solution pour vous:
Créer des classes dérivées à partir du Système.Web.L'INTERFACE utilisateur.La Page qui ont la QueryString paramètres de propriétés. Aussi, à l'aide d'une fonction d'utilité (voir ConvertType, ci-dessous), vous n'avez pas besoin d'en faire trop pour obtenir les données de la chaîne de Requête. Enfin, à l'intérieur de ces classes dérivées, de définir une statique à l'intérieur de la classe qui contient les constantes qui sont les noms des paramètres de chaîne de Requête, de sorte que vous n'avez pas besoin de faire référence à toute la magie des valeurs de n'importe où.
J'ai l'habitude de définir une page de base de la classe pour mon projet, ce qui en fait un endroit idéal pour faire des choses ordinaires qui se produisent sur toutes les pages, ainsi que quelques fonctions utilitaires:
Puis, dans votre page régulière, dans le code derrière, il ressemble maintenant à ceci:
Elle rend le code derrière classes très propre (comme vous pouvez le voir), et il est facilement maintenable car tout le gros du travail est fait par deux fonctions (GetQueryStringValue et ChangeType) qui sont réutilisés dans chaque page de classes, et tout est de type sécurisé (vous remarquerez que dans GetQueryStringValue que vous pouvez spécifier si la fonction renvoie si la valeur ne peut pas être converti ou utilise simplement renvoie la valeur par défaut; les deux sont appropriées à différents moments, en fonction de votre application).
En outre, vous pouvez même facilement écrire un VS plugin ou CodeSmith script pour générer les dérivées de la classe de la page assez facilement. Et il n'y a pas un tas de délégués et des trucs étant passé autour, que je trouve de nouveaux développeurs ont du mal à comprendre.