2009-05-24 10 views
3

タイプ名を指定する属性を持つ汎用ASP.NETサーバーコントロールを構築しています。私はコントロールビルダーを使用して、コントロールの汎用バージョンを生成するために、属性値をType.GetType(string)に渡します。これは素晴らしいです。しかし、私が指定するタイプは、私はこのような構文を使用する必要があり、一般的なものであれば:Type.GetType(文字列) "Generic <T>"構文を使用していますか?

<gwb:GenericControl runat="server" 
    TypeName="System.Collections.Generic.List`1[System.String]" /> 

私はこのようにそれを入力できるようにしたいと思います:

<gwb:GenericControl runat="server" 
    TypeName="System.Collections.Generic.List<System.String>" /> 

私が知っています私は手動で角括弧の値を解析し、それらを角括弧に変換し、適切なバックティック・数値接頭辞を追加することができましたが、この変換を行う組み込みの方法があるかどうか疑問に思っていましたか?私はGeneric<T>の構文がC#(または少なくともVB.NETでは異なる)であると仮定しているので、他の言語固有の構文も解析する必要があります。

PageディレクティブのInherits属性でASP.NET MVCがこれを実行していることに気がつきましたが、わかりません。

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage<MyModel>" %> 

答えて

5

いいえ、これを行う方法はありません。その理由は、Generic<T>のような型名はC#固有のものです。実際には、メタデータに別々に書き出されます。

短いバージョンでは、タイプ名に、`が続き、その後に汎用パラメータの数に対応する数字が続きます。 Generic<T>は、例えばGeneric `と書かれ、Generic<T1,T2>はGeneric `として書かれます。2.配列は構文に少し複雑ですが、一般的なルールです。

Type.GetTypeを使用すると、実際にはMetaDataクエリとC#クエリを実行しています。したがって、タイプ名はMetaDataに表示されるとおりに指定する必要があります。

2

これを行う方法はありません。あなたはそれを解析する必要があります。これはおそらく、MVCフレームワークが内部的にやっていることです。

1

実際には、特定の構文を使用することはできません。あなたの実際の構文は、XMLの性質に以下の原因でなければならないであろう。

<gwb:GenericControl runat="server" 
    TypeName="System.Collections.Generic.List&lt;System.String>" /> 

そのは>を対応する存在している場合は、属性の値の範囲内<文字を使用することはできません。 & ltでエンコードする必要があります。これは最初のように動作させようとする点を打ち消すものです。

最初のフォームは標準のILフォーム(つまりNamespace.GenericClass`1 [[System.String]])であり、.NET言語ユーザーにはよく知られていて、ボード全体で共通している必要があります。 C#で有効です。

+0

ASP.NET MVCフレームワークもこのルールに違反しているのではなく、XMLディレクティブの一部と見なされないPageディレクティブですか? – GWB

+0

PageディレクティブはXMLドキュメントの一部ではありません。 <%@ and %>は、ASPXコンパイラによってすべて処理される、義務的なものの間のもののような、インラインコードのカテゴリに入れます。ページがXMLバリデーターを介して送信される前に、すべて処理され、取り除かれるか、マークアップに変わります。 – jrista

関連する問題