C# は列挙型文字列を通じて列挙を反映します。
型文字列ごとに任意の型を反映します
Old Gu は以前ブログを書きましたが、リフレクションと文字列の使用を通じて、ジェネリック型を含む、現在のプロジェクトで使用可能なすべての型を反映できます。補習が必要な友人は、Lao Gu の以前の記事「C# 型名文字列に基づいて任意の型 (ジェネリックを含む) のオブジェクトを作成する」を参照してください。
老固自身は、この方法を使用するのは通常、穴に落ちるのは自分の選択であると述べましたが、実際に時々使用されます。
列挙型
一般に自社開発プログラムでは、特定の限られたデータについては、プロジェクトに参加するすべての小規模パートナーを標準化し、曖昧さや不規則な内容を避けるために列挙型を作成することが一般的です。
たとえば、注文ステータスは、ビジネス プロセスに従っていくつかの段階に分割できます。
保留
中の注文を送信 受領済み保留中の
支払い支払い済み 出荷保留中出荷済み 出荷完了注文完了
など、そのような有限の状態の集合。
たとえば、ネットワーク リソースにアクセスすると、200、404、401、500 などのステータス コードが返されます。これらは有限の状態であるため、通常は Enum を使用して列挙セットを定義し、データを標準化できます。
この種の操作は主に、一部の小規模パートナーが支払い保留中の書き込みを行うこと、一部の小規模パートナーが未払いの書き込みを行うこと、および一部の小規模パートナーが支払い保留中の書き込みを行うことを回避することを目的としています。。。つまり、列挙指定をしないと同じ意味のデータがどれだけ現れるかは神のみぞ知るということです。
CSDN文盲の老谷のブログ、https://blog.csdn.net/superwfei
老谷の個人コミュニティ、https://bbs.csdn.net/forums/bfba6c5031e6 4c13aa7c60eebe858a5f?category=10003&typeId=3364713
リフレクションによる列挙型の呼び出し
ほとんどの場合、列挙型を使用するときはその型が明確にわかっているため、通常は Enum.GetName(enumeration type, value) を直接使用して、対応するテキストの説明を取得します。
ただし、場合によっては、列挙を呼び出す必要がある位置が手書きのコードではなく、テンプレート定義のようなものになることがあります。たとえば、Lao Gu には次のようなテンプレート定義があります。
404.enum.httpstate
404 は値、enum は呼び出し元の列挙型、httpsstate は列挙型です。
普通にプログラムに書くとこうなるはずです
Enum.GetName(httpstate,404)
しかし、テンプレにある言葉。。。この httpsstate は解析できますが、複数のテンプレートがあり、列挙型が一貫していない場合はどうなるでしょうか。
たとえば、次のようなテンプレート コンテンツがあります。
html symbols: ^lt,enum,htmlsymbols^ ^trage,enum,htmlsymbols^ ^gt,enum,htmlsymbols^
http state: ^200.enum.httpstate^ ^403.enum.httpstate^ ^500.enum.httpstate^
bidstate: ^11.enum.trade^ ^91.enum.trade^ ^99.enum.trade^
そして、ここには 3 つのタイプが列挙されていますが、数が少ない場合は、プログラムを使用して 1 つずつ分岐したり、切り替えたりすることは可能ですが、新しいタイプがある場合は、それでも非常に面倒で、多くの場合、必要になります。コードを変更しました。
したがって、引き続きリフレクションを通じて列挙呼び出しを実装します。
GetTypeByName(EnumName) が空ですか?
以前に定義したメソッド GetTypeByName を直接使用して、クラス名文字列を通じてクラスを呼び出し、その中のパラメーターが列挙型に与えられます。。。結果。。。列挙型を取得できませんか? 型は null を返しますか? ?
ジェネリックスも理解しました。列挙型は使用できないと教えてください。
foreach (Type st in ts)
{
if (RegexExpand.IsMatch(st.FullName, @"\." + RegexExpand.FormatRegExp(source) + @"(`?\d+)?$"))
{
return st;
}
}
元のコードを開くと、RegexExpand.IsMatch 行で Lao Gu がブレークポイントに到達し、列挙型 Enum の文字列型を見つけました。。。ちょっと唖然としました。
さて、クラスに関しては、FullName が xxx.yyy.zzz のやり方、generic が xxx.yyy.zzz`n のやり方で、結果として列挙型は、xxx.yyy+zzz のやり方を与えています。。。。
したがって、変更は非常に簡単で、コード内の通常の@“\.”を@"[\.+]"に置き換えるだけです。
その後、列挙体を呼び出してコンテンツを通常どおり処理できます。
try
{
Type t = Common.GetTypeByName(枚举类型字符串);
return Enum.GetName(t, int.Parse(枚举值));
}
catch (Exception ex)
{
return ex.Message;
}
まとめ
まあ、あまり要約することはありません。FullName の形式だけです。これは少し予想外ですが、おそらく FullName には他の形式もあるでしょう。要するに、もっと知っておいた方が良いということです。
なお、RegexExpand は Lao Gu によって定義された静的クラスであり、Regex を継承して拡張するもので、Regex に直接変更できることを付け加えておきます。
FormatRegExp メソッドは、py の re.escape と同様に、文字列を正規表現に変換します。
public static string FormatRegExp(string str)
{
return str.Replace("\\", @"\\").Replace("(", "\\(").Replace(")", "\\)").Replace("{", "\\{").Replace("}", "\\}").Replace("[", "\\[").Replace("]", "\\]").Replace(".", "\\.").Replace("+", "\\+").Replace("-", "\\-").Replace("^", "\\^").Replace("$", "\\$").Replace("?", "\\?").Replace("*", "\\*").Replace("|", "\\|");
}
実際には、いくつかの文字を置き換えるだけで、好きな場所に配置できます。