19

これは簡単な質問のように思えますが、何らかの理由でどこにも答えが見つかりません。基本的には、 NamedParametersを取るコンストラクターを実装できるようにしたいと考えています。

名前付きパラメーターとは、次のような既定値 (オプションのパラメーター) を持つパラメーターを意味するものではありません。

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

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

私が達成しようとしているものの良い例は、System.Web.MvcアセンブリのAuthorizeAttributeです。次の方法で使用できます。

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

}

インテリセンスでのコンストラクターの署名は次の例のようになり、これらの NamedParameters がクラス プロパティにマッピングされていると思います (確認してください)。

AuthorizeAttribute.AuthorizeAttribute( NamedParameters... ) System.Web.Mvc.AuthorizeAttribute クラスの新しいインスタンスを初期化します

名前付きパラメーター:

  • 順序 int
  • ユーザー文字列
  • ロール文字列
4

10 に答える 10

18

ご注意ください:

メソッドを呼び出すときにパラメーター名を定義する構文は、オプションのパラメーターとは関係ありません。

が次のように宣言されFoo(bar1 : "customBar1");ていても使用できます。Foovoid Foo(string bar1)


質問への回答:
私の推測では、これは Visual Studio 2010 で導入されたオブジェクト初期化子に似たシンタックス シュガーであるため、独自のクラスには使用できません。

于 2012-08-21T14:12:17.373 に答える
15

あなたが話している動作は属性に固有のものであり、「通常の」クラスコンストラクターでは再利用できません。

于 2012-08-21T14:08:59.667 に答える
7

何も「実装」する必要はありません。

パラメーターは、コンストラクターのパラメーターとして存在するだけで、記述した方法で使用できます。

C# 3.5 以降が導入されたときは、それらを使用する必要があります

あなたの例は、変更なしで C# 4.0 / Visual Studio 2010 でコンパイルおよび実行されます。

MSDN の「名前付き引数と省略可能な引数 (C# プログラミング ガイド)」を参照してください。


対応するコンストラクター引数を持たないオブジェクトのプロパティに関しては、正確な構文は属性に固有のものであり、複製することはできませんが、オブジェクト初期化子を使用すると近づけることができます。

于 2012-08-21T14:10:38.540 に答える
3

ビルダー/コンストラクター情報パターンをプロパティ初期化子と共に使用できます。

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);
于 2012-08-21T14:06:34.653 に答える
1

私はそれが可能であることを疑います。これは、属性に固有のものです。

最も近いオプションは、オブジェクト初期化子を使用することだと思います:

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

var foo = new Foo {Name = "MyName", Data = 12};
于 2012-08-21T14:11:44.530 に答える
0

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);
}

ここで、引数がその順序で渡されることがわかります

于 2015-01-19T13:14:23.143 に答える