1

というカスタム属性を作成しましたRouteAttribute:

[AttributeUsage(AttributeTargets.Property)]
public class RouteAttribute : Attribute
{
    public string Url { get; set; }
    public bool CheckPhysicalUrlAccess { get; set; }
    public RouteValueDictionary Defaults { get; set; }
    public RouteValueDictionary Constraints { get; set; }
    public RouteValueDictionary DataTokens { get; set; }
}

サイト内の URL のリストを含む URL ヘルパー クラスの属性を介してルーティングを追加するために使用されるため、サイトの URL を簡単に管理できます。

ただし、デフォルトの追加に問題があり、コンパイラ エラーが発生します。

[Route("~/MyPage/Home.aspx", new RouteValueDictionary { { "query", "value" } })]
public string HomePage
{
  get { return "Home" }
}

混乱を避けるために、値は routeurl に設定され、物理 URL は属性から取得されます。その理由は、既存のサイトを変換しているためです。リンクをどこでも変更するのではなく、ページの操作が完了したら、自分のクラスに移動します。物理URLを新しいページに変更します

エラーを与える:

属性引数は、定数式、typeof 式、または属性パラメーター タイプの配列作成式でなければなりません

4

2 に答える 2

1

属性コンストラクターの引数値は、メタデータに格納されます。これにより、指定できる内容に厳しい制限が課せられます。単純な値の型、typeof からの Type、およびこれらの値の単純な 1 次元配列です。コードは許可されていません。これは、コンパイラーが不平を言っていることです。 new演算子にはコードが必要です。

属性コンストラクターの本体で実行できる操作に制限はありません。そのコードは、後でリフレクション コードが属性を検査するときに実行されます。これに似たものを提案する:

public class RouteAttribute : Attribute
{
    public RouteAttribute(string url, string query, string value) {
       this.url = url;
       this.dunno = new RouteValueDictionary(query, value);
    }
    // etc..
}
...
[Route("~/MyPage/Home.aspx", "query", "value")]
public string HomePage
{
  get { return "Home" }
}

これには明らかに作業が必要です。辞書の意味がわかりません。副作用があるか、リソースを必要とすることに注意してください。属性が構築されるときの実行時の状態はわかりません。

于 2011-02-25T15:21:55.287 に答える
1

属性引数は、定数式、typeof 式、または属性パラメーター タイプの配列作成式でなければなりません

エラーは、問題が何であるかを正確に示しています。

として

new RouteValueDictionary { { "query", "value" } }

は定数式でも、typeof 式でも、配列作成式でもありません。これは正しくありません。

于 2011-02-25T14:50:04.540 に答える