如何定义命名参数C#
这似乎是一个简单的问题,但由于某种原因,我在任何地方都找不到答案。基本上,我希望能够实现一个采用命名参数的构造函数如何定义命名参数C#,c#,.net,custom-attributes,named-parameters,C#,.net,Custom Attributes,Named Parameters,这似乎是一个简单的问题,但由于某种原因,我在任何地方都找不到答案。基本上,我希望能够实现一个采用命名参数的构造函数 所谓命名参数,我不是指具有默认值(可选参数)的参数,例如: 我试图实现的一个很好的例子是来自System.Web.Mvc程序集的authorized属性。您可以使用以下方法: [Authorize(Roles = "Administrators", Users = "ThatCoolGuy")] public ActionResult Admin(){ } intellisen
所谓命名参数,我不是指具有默认值(可选参数)的参数,例如: 我试图实现的一个很好的例子是来自System.Web.Mvc程序集的authorized属性。您可以使用以下方法:
[Authorize(Roles = "Administrators", Users = "ThatCoolGuy")]
public ActionResult Admin(){
}
intellisense中构造函数的签名看起来像下面的示例,我相信(请确认)那些NamedParameters正在映射到类属性
AuthorizeAttribute.AuthorizeAttribute(NamedParameters…)
初始化System.Web.Mvc.AuthorizeAttribute类的新实例
命名参数:
- 整数阶
- 用户字符串
- 角色字符串
您可以将生成器/构造函数信息模式与属性初始值设定项一起使用
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();
但我不明白,为什么不使用命名参数并提供null来指示可选参数
class Person
{
public Person(string name = null, int? age = null, Color? favoriteColor = null) { /* ... */ }
}
var p = new Person(name: "Peter", age: 15);
您所谈论的行为是特定于属性的,不能在“普通”类构造函数中重用。您不需要“实现”任何东西 这些参数可以按照您描述的方式使用,只需作为构造函数上的参数存在即可 引入C#3.5或更高版本时,您确实需要使用它们 您的示例将在C#4.0/Visual Studio 2010上编译并运行,无需修改 请参阅MSDN上的
对于对象上没有相应构造函数参数的属性,确切的语法是特定于属性的,无法复制,但是,您可以接近它。我怀疑这是可能的。这是特定于属性的东西 我认为最接近的选择是使用对象初始值设定项:
class Foo {
public string Name {get;set;}
public int Data {get;set;}
}
var foo = new Foo {Name = "MyName", Data = 12};
请注意:
调用方法时定义参数名的语法与可选参数无关:
您可以使用Foo(bar1:“customBar1”)
即使Foo
是这样声明的:void Foo(string bar1)
回答问题:
我的猜测是,这与Visual Studio 2010中引入的语法相似,因此您不能将其用于自己的类。尝试使用此签名
[AttributeUsage(AttributeTargets.Class)]
在类的名称之前命名的参数不是特定于属性的。这是一种可以在任何地方使用的语言语法。可以为初始化器使用属性,但并不总是希望将内部设置为set属性 只需使用以下命令实例化您的类:
TheClass c = new Theclass(param3:firstValue, param1:secondValue, param2:secondValue);
关于问题的这部分:
“但是,我不明白,为什么不使用命名参数并提供null来指示可选参数。”
命名参数之所以很好,是因为您不需要在括号中提供额外的值,而只是您想要指定的值,因为如果它是可选的,您甚至不需要输入null。此外,如果指定null,则将覆盖该参数的任何默认值,从而使其成为可选值。可选意味着有一个默认值,表示没有传入任何内容
实例时的属性初始化纯粹是为了方便。自从C语言以来,就有能力在构造时初始化类型上的值。如果这些值不能在构造函数中指定,那么这很方便。我个人觉得,他们的便利已经宠坏了人们,它变得有点太自由了,把一切都公之于众。这取决于所需属性的设计和安全性。Visual C#2010引入了命名参数和可选参数。命名参数通过将参数与参数名称关联,而不是与参数在参数列表中的位置关联,可以指定特定参数的参数。命名参数使您无需记住或查找被调用方法的参数列表中参数的顺序
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);
}
在这里,您可以看到参数随订单一起传递有关完整说明,请参阅MSDN规范:
“属性类的每个非静态公共读写字段和属性为属性类定义了一个命名参数”。您可能要做的是在属性中实现公共属性:
public class AuditFilterAttribute : ActionFilterAttribute
{
public string Message { get; set; }
public AuditFilterAttribute() { }
}
可以通过您应用的命名参数访问它们:
[AuditFilter(Message = "Deleting user")]
public ActionResult DeleteUser(int userId)
希望这有助于…@Jodrell如果您查看元数据或reflector中的类定义,AuthorizeAttribute只有1个构造函数定义,它不带参数,但您可以通过某种方式将类属性(命名参数)传递给它名称参数自.NET 4.0以来就一直存在-它们不仅仅用于属性。OP希望与属性中的行为相同:使用类属性作为可选属性parameters@Oded:请注意
Name=“Value”
和Name:“Value”
之间的区别。这个微小的差别正是OP想要的。这个答案不值得否决票。只要任何类在其继承树中有属性类,如果该类有一个具有公共集的属性,它将出现在intellisense定义中,并可用作命名参数“通过命名参数,我不是指具有默认值(可选参数)的参数,如“+“intellisense中构造函数的签名看起来像下面的示例,我相信(请确认)那些NamedParameters正在映射到类属性。”这并不完全正确。在.NET 3.5应用程序中可以使用命名参数,但您需要VS2010。确定…新人(姓名:“Peter”,年龄:15岁)
与新人{Name]这样的东西相比,我觉得没有那么糟糕=
[AuditFilter(Message = "Deleting user")]
public ActionResult DeleteUser(int userId)