Comment définir les paramètres nommés C#

cela semble comme une question simple, mais pour une raison quelconque, Je ne peux pas trouver la réponse n'importe où. Fondamentalement, je voudrais être en mesure de mettre en œuvre un constructeur qui prend paramètres nommés .

par paramètres nommés, Je ne veux pas dire les paramètres avec des valeurs par défaut (paramètres optionnels) tels que:

public SomeMethod(){
    string newBar = Foo(bar2 : "customBar2");
}

public string Foo(string bar1 = "bar1", bar2 = "bar2" ){
     //...
}

un bon exemple de ce que j'essaie de réaliser est le AuthorizeAttribute de la Système .Web.Mvc montage. Que vous pouvez utiliser de la manière suivante:

[Authorize(Roles = "Administrators", Users = "ThatCoolGuy")]
public ActionResult Admin(){

}

la signature du constructeur dans intellisense ressemble à l'exemple suivant et je crois (Veuillez confirmer) que ces paramètres nommés correspondent aux propriétés de classe.

AuthorizeAttribute.AuthorizeAttribute ( NamedParameters... ) Initilize nouvelle instance du système.Web.Mvc.AuthorizeAttribute classe

paramètres nommés:

    "1519260920 de Commande" int
  • Utilisateurs "chaîne de 1519270920"
  • les Rôles de la chaîne
17
demandé sur Kiquenet 2012-08-21 18:04:28

10 réponses

le comportement dont vous parlez est spécifique aux attributs et ne peut pas être réutilisé dans les constructeurs de classes" normales".

14
répondu mathieu 2012-08-21 14:08:59

s'il vous Plaît note:

la syntaxe pour définir le nom du paramètre lors de l'appel d'une méthode n'a rien à voir avec les paramètres optionnels:

vous pouvez utiliser Foo(bar1 : "customBar1"); même si Foo est déclaré comme ceci: void Foo(string bar1)


pour répondre à la question:

À mon avis, il s'agit de sucre syntaxique similaire au initialisateurs d'objets introduit en Visual Studio 2010 et donc vous ne pouvez pas l'utiliser pour vos propres cours.

15
répondu Daniel Hilgarth 2012-08-21 14:19:24

vous n'avez pas besoin de" mettre en œuvre " quoi que ce soit.

les paramètres peuvent être utilisés de la manière que vous décrivez simplement en existant comme paramètres sur le constructeur.

vous do besoin d'utiliser C# 3.5 ou plus, quand ils ont été introduits.

votre exemple compilera et exécutera sur C# 4.0 / Visual Studio 2010 sans modification.

voir Arguments nommés et optionnels (C# Guide de programmation) sur MSDN.


en ce qui concerne les propriétés sur l'objet, qui n'ont pas d'arguments de constructeur correspondants, la syntaxe exacte est spécifique aux attributs et ne peut pas être répliqué, bien que, avec initialiseurs d'objet vous pouvez obtenir proche.

6
répondu Oded 2012-08-21 14:23:24

vous pouvez utiliser le constructeur/constructeur info pattern Avec initialiseurs de propriété.

class PersonInfo
{
    public string Name { get; set; }
    public int? Age { get; set; }
    public Color? FavoriteColor { get; set; }

    public Person BuildPerson()
    {
        return new Person(this);
    }
}

class Person
{
    public Person(PersonInfo info)
    {
        // use info and handle optional/nullable parameters to initialize person
    }

    ...
}

var p = new Person(new PersonInfo { Name = "Peter", Age = 15 });
// yet better
var p = new PersonInfo { Name = "Peter", Age = 15 }.BuildPerson();

cependant, je ne comprends pas, pourquoi vous n'utilisez pas simplement les paramètres nommés et fournir null pour indiquer les paramètres optionnels.

class Person
{
    public Person(string name = null, int? age = null, Color? favoriteColor = null) { /* ... */ }
}

var p = new Person(name: "Peter", age: 15);
3
répondu Sebastian Graf 2012-08-21 14:24:23

je doute que ce soit possible. C'est quelque chose de spécifique pour les attributs.

je pense que l'option la plus proche est d'utiliser un initialiseur d'objet:

class Foo {
    public string Name {get;set;}
    public int Data {get;set;}
}

var foo = new Foo {Name = "MyName", Data = 12};
1
répondu Jensen 2012-08-21 14:11:44

essayez d'utiliser cette signature

[AttributeUsage(AttributeTargets.Class)]

avant le nom de votre classe

0
répondu Diogo de Freitas nunes 2014-11-06 12:58:39

s'il vous Plaît se référer à MSDN spécification pour la description complète:

https://msdn.microsoft.com/en-us/library/aa664614 (v=71).aspx

chaque champ public non statique de lecture-écriture et propriété pour une classe d'attribut définit un paramètre nommé pour la classe d'attribut ".

0
répondu rahnema1 2016-07-12 13:55:56
Les paramètres nommés

ne sont pas spécifiques aux attributs. C'est une syntaxe qui peut être utilisée partout. C'est bien d'utiliser des propriétés pour initialiseurs, mais vous ne voulez pas toujours avoir des propriétés internes définies comme propriétés définies.

instanciez simplement votre classe en utilisant:

TheClass c = new Theclass(param3:firstValue, param1:secondValue, param2:secondValue);

en ce qui concerne cette partie de la question:

" Je ne comprends cependant pas pourquoi vous n'utilisez pas simplement les paramètres nommés et indiquer null pour l'indication des paramètres optionnels."

la raison pour laquelle les paramètres nommés sont agréables est que vous n'avez pas besoin de fournir des valeurs externes entre parenthèses, juste ce que vous voulez spécifier, parce que si c'est optionnel, vous ne devriez même pas avoir besoin de mettre null. De plus, si vous spécifiez null, vous supprimez toute valeur par défaut pour ce paramètre qui le rend optionnel. Être optionnel implique qu'il y a une valeur par défaut qui signifie que rien n'est passé.

l'initialisation de la propriété à l'Heure de l'instance est purement là pour la commodité. Depuis C, il a été possible d'initialiser les valeurs au moment de la construction sur les types. Ce qui est pratique si ces valeurs ne peuvent pas être spécifiées dans le constructeur. Je pense personnellement que la commodité d'eux a gâté les gens et il obtenir un peu trop libéral et faire tout public obtenir et mettre. Tout dépend de la conception et de la sécurité des propriétés dont vous avez besoin.

0
répondu Stephen York 2017-03-08 15:02:12

Visual C# 2010 introduit les arguments nommés et optionnels. Named argument vous permet de spécifier un argument pour un paramètre particulier en associant l'argument avec le nom du paramètre plutôt qu'avec la position du paramètre dans la liste des paramètres.Les arguments nommés vous libèrent du besoin de vous souvenir ou de chercher l'ordre des paramètres dans les listes de paramètres des méthodes appelées.

static void Main(string[] args)
{
    mapingFunction(snum2: "www.stackoverflow.com", num1: 1);
}
public static void mapingFunction(int num1, string snum2)
{
   Console.WriteLine(num1 + " and " + snum2);
}

ici, vous pouvez voir que l'argument sont passés avec notre ordre

0
répondu Adiii 2017-03-08 16:08:53

ce que vous voulez probablement faire est d'implémenter des propriétés publiques dans votre attribut:

public class AuditFilterAttribute : ActionFilterAttribute
{
    public string Message { get; set; }

    public AuditFilterAttribute() { }
}

ils peuvent être accessibles à travers les paramètres nommés où vous l'appliquez:

[AuditFilter(Message = "Deleting user")]
public ActionResult DeleteUser(int userId)

Espère que ça aide...

0
répondu Fred Mauroy 2017-11-29 14:32:20